#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1<<20;
int ord[N], ord2[N], a[N], b[N], cnt[N], c[N], l1[N], l2[N], r1[N];
void solve(int n, int k){
int z = 0;
for (int i=1;i<=n;i++){
if ((1<<k) & a[i])
b[i] += (1<<k);
else
z++;
swap(ord[i], ord2[i]);
}
for (int i=1, O = 0, Z = 0;i<=n;i++){
if (b[ord2[i]] & (1<<k))
O++, ord[z + O] = ord2[i];
else
Z++, ord[Z] = ord2[i];
}
for (int i=1;i<=n;i++)
c[i] = b[ord[i]];
for (int i=1, r = n + 1;i<=n;i++){
while (r - 1 >= i and c[i] + c[r - 1] >= (1<<k))
r--;
l1[i] = max(i, r);
}
for (int i=1, r = n + 1;i<=n;i++){
while (r - 1 >= i and c[i] + c[r - 1] >= (2<<k))
r--;
r1[i] = max(i, r);
}
for (int i=1, r = n + 1;i<=n;i++){
while (r - 1 >= i and c[i] + c[r - 1] >= (1<<k) + (2<<k))
r--;
l2[i] = max(i, r);
}
for (int i=1;i<=n;i++){
cnt[k] ^= (n + 1 - l2[i]) & 1;
cnt[k] ^= (r1[i] - l1[i]) & 1;
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, Ans = 0, ln = 0;
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i], ord[i] = i, ln = max(ln, 31 - __builtin_clz(a[i]));
// cout<<ln<<'\n';
for (int i=0;i<=ln+1;i++)
solve(n, i);
for (int i=0;i<=ln+1;i++)
Ans |= cnt[i]<<i;
cout<<Ans<<'\n';
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |