可持久化字典树。。没注意到可能有n+m个数据情况,re了两发。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int A[600010],T[16000000][2],v[16000000],root[600010],B[40],cnt;
char s[10];
void insert(int &f,int x){
if(x==-1) return;
T[++cnt][0]=T[f][0];
T[cnt][1]=T[f][1];
v[cnt]=v[f]+1;
f=cnt;
insert(T[f][B[x]],x-1);
}
int find(int l,int r){
int u,i,ans=0;
for(i=25;i>=1;i--){
u=B[i];
ans*=2;
if(v[T[r][!u]]-v[T[l][!u]]){
ans+=1;
r=T[r][!u];
l=T[l][!u];
}
else{
r=T[r][u];
l=T[l][u];
}
}
return ans;
}
int main(){
int i,j,n,m,a,b,c;
scanf("%d%d",&n,&m);
cnt=0;
n++;
root[1]=root[0];
insert(root[1],25);
for(i=2;i<=n;i++){
scanf("%d",&a);
A[i]=A[i-1]^a;
a=A[i];
for(j=1;j<=25;j++){
B[j]=a%2;
a/=2;
}
root[i]=root[i-1];
insert(root[i],25);
}
while(m--){
scanf("%s",&s);
if(s[0]=='A'){
scanf("%d",&a);
n++;
A[n]=A[n-1]^a;
a=A[n];
for(i=1;i<=25;i++){
B[i]=a%2;
a/=2;
}
root[n]=root[n-1];
insert(root[n],25);
}
else{
scanf("%d%d%d",&a,&b,&c);
c=c^A[n];
for(i=1;i<=25;i++){
B[i]=c%2;
c/=2;
}
int ans=find(root[a-1],root[b]);
printf("%d\n",ans);
}
}
return 0;
}