我把讨论区的所有警示都翻遍了,还是不知道哪里错了
#include<bits/stdc++.h>
using namespace std;
const int N = 600100,M = N*27;
int n,m;
struct node{
int s[2];
}tr[M];//字典树
int max_id[M];
int cnt,idx;//前者节点数量,后者版本数量
int root[N];//版本号
int sum[N];//异或前缀和
void insert(int x,int id){//插入
++idx,++cnt;
root[idx]=cnt;
int p=root[idx-1],u=root[idx];
for(int i=23,t;i>=0;i--){
t=(x>>i)&1;
if(tr[p].s[t^1])
tr[u].s[t^1]=tr[p].s[t^1];
tr[u].s[t]=++cnt;
max_id[cnt]=id;
p=tr[p].s[t],u=tr[u].s[t];
}
}
int query(int x,int r,int l){
int u=root[r],res=0;
for(int i=23,t;i>=0;i--){
t=(x>>i)&1;
if(tr[u].s[t^1] && max_id[tr[u].s[t^1]]>=l)
u=tr[u].s[t^1],res^=(1<<i);
else{
u=tr[u].s[t];
}
}
return res;
}
int main(){
char c[2];
int l,r,x;
insert(0,0);//警示后人中加的
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x);
sum[i]=sum[i-1]^x;
insert(sum[i],i);
}
while(m--){
scanf("%s",c);
if(c[0]=='A'){
scanf("%d",&x);n++;
sum[n]=sum[n-1]^x;
insert(sum[x],n);
}else{
scanf("%d%d%d",&l,&r,&x);
x=x^sum[n];
printf("%d\n",query(x,r,l-1));
//主要是因为版本号多1,但是插入编号没变,所以l-1,r不减1
}
}
return 0;
}
//void couten(){
// printf("--------------\n");
// printf("there're %d tries.\n",idx);
// for(int i=1;i<=idx;i++){
// vector<int> q;
// printf("time:%d,id:%d\n",i,root[i]);
// q.push_back(root[i]);
// while(q.size()){
// vector<int> g;
// for(int i=0;i<q.size();i++){
// printf("%d[0:%d,1:%d](%d) ",q[i],tr[q[i]].s[0],
// tr[q[i]].s[1],max_id[q[i]]);
// if(tr[q[i]].s[0]) g.push_back(tr[q[i]].s[0]);
// if(tr[q[i]].s[1]) g.push_back(tr[q[i]].s[1]);
// }
// q=g;
// puts("");
// }
// puts("");
// }
// puts("---------------\n");
//}