挺可持久化的实现过程
#include<bits/stdc++.h>
#define int long long
#define F(i,i0,n) for(int i=i0;i<=n;i++)
using namespace std;
inline int rd(){
int f=0,x=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return f?-x:x;
}
const int N=2e7+5,inf=1e9;
int n,m;
struct Trie{
int ch[N][2],val[N],rt[N],tot,cnt[N],num;
void ins(int x){
rt[++num]=++tot;val[num]=x;
int l=rt[num-1],r=rt[num];
for(int i=30;~i;--i){
int k=(x>>i)&1;
ch[r][k^1]=ch[l][k^1];
ch[r][k]=++tot;
l=ch[l][k],r=ch[r][k];
cnt[r]=cnt[l]+1;
}
}
int que(int o1,int o2,int x){
int ans=0;
o1=rt[o1],o2=rt[o2];
for(int i=30;~i;--i){
int k=(x>>i)&1;
if(cnt[ch[o1][k^1]]-cnt[ch[o2][k^1]]){//这个是是否存在真实的节点
ans+=(1<<i);
o1=ch[o1][k^1];
o2=ch[o2][k^1];
}
else {
o1=ch[o1][k];
o2=ch[o2][k];
}
}
return ans;
}
}trie;
signed main(){
n=rd(),m=rd();
trie.ins(0);
int sum=0;
F(i,1,n){
int x=rd();
trie.ins(sum^=x);
}
while(m--){
char op;cin>>op;
if(op=='A'){
int x=rd();
trie.ins(sum^=x);
}
else {
int l=rd(),r=rd(),x=rd();
cout<<trie.que(r,l-1,sum^x)<<'\n';
}
}
return 0;
}