社区大佬分享的第11个测试点,本地测试过了,但交上洛谷没过!震惊,求调
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
int n,m,idx,cnt,rt1,rt2;
int a[N],tr[N*25][3],root[N],mex[N*25];
inline int read(){
int t=0,f=1;
register char c=getchar();
while (c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
while (c>=48&&c<=57)t=(t<<1)+(t<<3)+(c^48),c=getchar();
return f*t;
}
void insert(int x,int d){
root[d]=++cnt,rt2=cnt,mex[rt2]=d;
if(d!=0) rt1=root[d-1];
else rt1=rt2;
for(int i=25;i>=1;i--){
int dang=(x>>i-1)&1;
tr[rt2][dang^1]=tr[rt1][dang^1];
tr[rt2][dang]=++cnt;
rt1=tr[rt1][dang],rt2=tr[rt2][dang];
mex[rt2]=d;
}
}
int find(int l,int r,int x){
int rt=root[r],sum=0;
for(int i=25;i>=1;i--){
int dang=(x>>i-1)&1;
if(tr[rt][dang^1]&&mex[tr[rt][dang^1]]>=l){
sum+=(1<<i-1);
rt=tr[rt][dang^1];
}else rt=tr[rt][dang];
}
return sum;
}
int main(){
n=read(),m=read(),idx=n;
for(int i=1;i<=n;i++) a[i]=read(),a[i]^=a[i-1];
for(int i=0;i<=n;i++) insert(a[i],i);
// for(int i=1;i<=n;i++) cout<<root[i]<<" ";
// cout<<endl;
while(m--){
char c;
cin>>c;
if(c=='A'){
int x=read();
a[++idx]=(x^a[idx-1]);
insert(a[idx],idx);
}else{
int l=read(),r=read(),x=read();
printf("%d\n",find((l-1),(r-1),(a[idx]^x)));
}
}
return 0;
}