code:
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+5,L=30;
struct node{int lasvis,c[2];};
int n,m,s,l,r,x,tot,init,stot,roottot,ch[L],root[N];
char opt;
node tr[N*25];
inline void change(int k){for(int i=25;i>=1;--i) ch[i]=(k&1),k>>=1;}
inline void insert(int rootord,int init,int lasvis){
change(init);
int p=root[rootord-1],q=root[rootord];
for(int i=1;i<=26;++i){
tr[q].lasvis=lasvis;
if(i==26) break;
if(p!=0) tr[q].c[0]=tr[p].c[0],tr[q].c[1]=tr[p].c[1];
tr[q].c[ch[i]]=++tot;
p=tr[p].c[ch[i]],q=tr[q].c[ch[i]];
}
}
inline int find(int l,int rootord,int val){
int p=root[rootord],ans=0;
change(val);
for(int i=1;i<=25;++i){
if(tr[tr[p].c[!ch[i]]].lasvis>=l) ans+=1<<(25-i),p=tr[p].c[!ch[i]];
else p=tr[p].c[ch[i]];
}
return ans;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> m,stot=n;
for(int i=1;i<=n;++i){
cin >> init;
s^=init;
root[++roottot]=++tot;
insert(roottot,s,i);
}
while(m--){
cin >> opt;
if(opt=='A') cin >> init,s^=init,++stot,root[++roottot]=++tot,insert(roottot,s,stot);
else{
cin >> l >> r >> x;
cout << find(l-1,r-1,s^x) << '\n';
}
}
return 0;
}
全部WA但是都错在好几千行的位置。求条qwq