You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.1 KiB
C++
90 lines
2.1 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
const int N = 100100;
|
|
int a[N];
|
|
int C[N];
|
|
int F[4][N];
|
|
int f(int l, int r)
|
|
{
|
|
for (int i = l; i <= r; i++) C[i]++;
|
|
return a[r] ^ a[l - 1];
|
|
}
|
|
int g(int l, int r)
|
|
{
|
|
int ret = 0;
|
|
for (int i = l; i <= r; i++)
|
|
for (int j = i; j <= r; j++)
|
|
ret ^= f(i, j);
|
|
return ret;
|
|
}
|
|
int w_brute(int l, int r)
|
|
{
|
|
int ret = 0;
|
|
for (int i = l; i <= r; i++)
|
|
for (int j = i; j <= r; j++)
|
|
ret ^= g(i, j);
|
|
return ret;
|
|
}
|
|
int w(int l, int r)
|
|
{
|
|
int len = (r - l + 1) & 3;
|
|
int offset, offset1, offset2;
|
|
switch (len)
|
|
{
|
|
case 0:
|
|
return 0;
|
|
case 1:
|
|
offset = (l - 1) & 3;
|
|
return F[offset][r] ^ F[offset][l - 1];
|
|
case 2:
|
|
offset1 = (l - 1) & 3;
|
|
offset2 = (l)&3;
|
|
return F[offset1][r] ^ F[offset1][l - 1] ^ F[offset2][r] ^ F[offset2][l - 1];
|
|
case 3:
|
|
offset = (l)&3;
|
|
return F[offset][r] ^ F[offset][l - 1];
|
|
}
|
|
}
|
|
int main()
|
|
{
|
|
/*for (int i = 1; i <= 15; i++)
|
|
{
|
|
memset(C, 0, sizeof C);
|
|
w(1, i);
|
|
for (int j = 1; j <= i; j++)
|
|
printf("%d ", C[j] & 1);
|
|
putchar('\n');
|
|
}
|
|
return 0;*/
|
|
int T, n, Q;
|
|
scanf("%d", &T);
|
|
while (T--)
|
|
{
|
|
scanf("%d", &n);
|
|
for (int i = 1; i <= n; i++)
|
|
scanf("%d", a + i);
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
int *ff = F[i];
|
|
for (int j = 1 + i; j <= n; j += 4)
|
|
ff[j] = a[j];
|
|
for (int j = 1; j <= n; j++) ff[j] ^= ff[j - 1];
|
|
}
|
|
for (int j = 1; j <= n; j++) a[j] ^= a[j - 1];
|
|
for (int l = 1; l <= n; l++)
|
|
for (int r = l; r <= n; r++)
|
|
printf("%d %d %d %d\n", l, r, w(l, r), w_brute(l, r));
|
|
continue;
|
|
scanf("%d", &Q);
|
|
while (Q--)
|
|
{
|
|
int l, r;
|
|
scanf("%d%d", &l, &r);
|
|
printf("%d %d\n", w(l, r), w_brute(l, r));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|