别人都在讨论为什么#11过不去,只有我看着我只过了#11的代码陷入沉思……
哥,要不咱俩的杂交一下?
#include <bits/stdc++.h>
using namespace std;
const long long Len=15,N=3e5,Num=Len*N*2;
long long a[N*2+5],s[N*2+5];
long long tr[Num+5][2],id[Num+5],idx;
long long root[N*2+5];
void insert(long long u,long long v,long long k){
for(long long i=Len;i>=0;i--){
long long c = (s[k]>>i)&1;
tr[u][c] = ++idx;
id[idx]=k;
tr[u][!c] = tr[v][!c];
u = tr[u][c];
v = tr[v][c];
}
}
long long query(long long u,long long l,long long x){
long long ans = 0;
for(long long i=Len;i>=0;i--){
long long c = (x>>i)&1;
if(tr[u][!c] and id[tr[u][!c]]>=l){
u=tr[u][!c];
ans+=(1<<i)*(!c);
}else{
u=tr[u][c];
ans+=(1<<i)*c;
}
}
return ans;
}
int main(){
long long n,m;
scanf("%lld%lld",&n,&m);
root[0]=++idx;
insert(root[0],0,0);
for(long long i=1;i<=n;i++){
long long x;
scanf("%lld",&x);
s[i]=s[i-1] xor x;
root[i]=++idx;
insert(root[i],root[i-1],i);
}
for(long long t=1;t<=m;t++){
char op[2];
scanf("%s",op);
if(op[0]=='A'){
long long x;
n++;
scanf("%lld",&x);
s[n]=s[n-1] xor x;
root[n]=++idx;
insert(root[n],root[n-1],n);
}else{
long long l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
printf("%lld\n",query(root[r-1],l-1,x xor s[n]) xor x xor s[n]);
}
}
return 0;
}
/*
5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
*/