#include<bits/stdc++.h>
using namespace std;
const int N=300010;
int n,m,r;
int a[N];
struct node{
int ch[2];
int last;
}t[N<<4];
struct tree{
int root[N];
int cnt;
tree(){
memset(root,0,sizeof root);
cnt=0;
}
int clone(int p)
{
++cnt;
t[cnt]=t[p];
return cnt;
}
int add(int p,int x ,int d,int last)
{
if(d==-1)return 0;
bool k=(x>>d)&1;
p=clone(p);
t[p].last=last;
t[p].ch[k]=add(t[p].ch[k],x,d-1,last);
return p;
}
int find(int l,int f2,int x,int d)
{
if(d==-1)return 0;
bool k=(x>>d)&1;
int ans=0;
if(t[t[f2].ch[!k]].last>=l)ans+=(1<<d),ans+=find(l,t[f2].ch[!k],x,d-1);
else if(t[t[f2].ch[k]].last>=l)ans+=find(l,t[f2].ch[k],x,d-1);
return ans;
}
}T;
int main()
{
scanf("%d%d",&n,&m);
for(r=1;r<=n;r++)
{
scanf("%d",&a[r]);
a[r]^=a[r-1];
T.root[r]=T.add(T.root[r-1],a[r],25,r);
}
r--;
while(m--)
{
char k;
int l,R,x;
cin>>k;
switch(k)
{
case 'A':{
++r;
scanf("%d",&a[r]);
a[r]^=a[r-1];
T.root[r]=T.add(T.root[r-1],a[r],25,r);
break;
}
case 'Q':{
scanf("%d%d%d",&l,&R,&x);
x^=a[r];
printf("%d\n",T.find(l-1,T.root[R-1],x,25));
break;
}
}
}
return 0;
}
蒟蒻求助,没问题啊,但是样例都过不了