#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define PR pair<int,int>
using namespace std;
const int kN=6e5+5;
int n,m,a[kN];
int rt[kN],last[kN*20],sum[kN],trie[kN*20][2],cnt;
void Insert(int k,int i,int p1,int &p2){
p2=++cnt;
if(k<0){
last[p2]=i;
return;
}
int ar=(sum[i]>>k)&1;
if(p1){
trie[p2][ar^1]=trie[p1][ar^1];
}
Insert(k-1,i,trie[p1][ar],trie[p2][ar]);
last[p2]=max(last[trie[p2][0]],last[trie[p2][1]]);
}
int Query(int l,int x,int p){
int now=p;
for(int i=23;i>=0;--i){
int ar=(x>>i)&1;
if(last[trie[now][ar^1]]>=l){
now=trie[now][ar^1];
}
else{
now=trie[now][ar];
}
}
return x^sum[last[now]];
}
signed main(){
scanf("%d%d",&n,&m);
Insert(23,0,0,rt[0]);
last[0]=-1;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
sum[i]=sum[i-1]^a[i];
Insert(23,i,rt[i-1],rt[i]);
}
for(int i=1;i<=m;++i){
char op;int l,r,x;
scanf(" %c",&op);
if(op=='A'){
scanf("%d",&x);
n++;
sum[n]=sum[n-1]^x;
Insert(23,n,rt[n-1],rt[n]);
}
else{
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",Query(l-1,sum[n]^x,rt[r-1]));
}
}
return 0;
}
加了代码中的 last[0]=1
AC ,没加就全WA
看了半天没看懂,求大佬看看是什么问题