考虑到分解为二进制后
疑惑后只有每一位是一得个数有奇数个才行
就统计出每位1,0的个数
查询,我也不是多明白。就这样搞吧。。。
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1000100;
int sum[2][N],ans,n,s[N],maxn,rest[N],ret;
void modify(int id,int x){for(;x<=N-100;x+=x&-x) sum[id][x]++;}
int query(int id,int x){int ans=0;for(;x;x-=x&-x) ans+=sum[id][x];return ans;}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&s[i]) ,s[i]+=s[i-1],maxn=max(maxn,s[i]);
for(int i=0;i<=20;i++){
if((1<<i)>maxn) break;
memset(sum,0,sizeof sum);modify(0,1);
int c=0;
for(int j=1;j<=n;j++){
int f=s[j]&(1<<i);
ret=query(f?0:1,rest[j]+1);
ret+=query(f?1:0,N-100)-query(f?1:0,rest[j]+1);
modify(f?1:0,rest[j]+1);
rest[j]|=f;
if(ret&1) c^=1;
}
if(c) ans|=(1<<i);
}
printf("%d",ans);
}