有etiger网站的同志可以看一下,没有的话可以走了~ 题号:2896 难度:提高+/省选- 一个点RTE QAQ
#include<bits/stdc++.h>
using namespace std;
const int N=300005;
const int B=31;
int n,m,px[N*8],rt[N*8];
int nT,x,l,r,v,timer;
char op;
struct Node{
int son[2];
int sz;
}trie[N*32];
void addRoot(int&u){
u=++nT;
}
#define sz(u) trie[u].sz
#define son(u,b) trie[u].son[b]
void addTrie(int now,int pre,int v,int p){
sz(now)=sz(pre)+1;
if(p<0) return;
bool b=((1<<p)&v);
if(!son(now,b)) son(now,b)=++nT;
son(now,b^1)=son(pre,b^1);
addTrie(son(now,b),son(pre,b),v,p-1);
}
int query(int now,int pre,int v,int p){
if(p<0)return 0;
bool b=((1<<p)&v);
int diff=sz(son(now,!b))-sz(son(pre,!b));
if(diff) return (1<<p)+query(son(now,!b),son(pre,!b),v,p-1);
else return query(son(now,b),son(pre,b),v,p-1);
}
int main(){
freopen("archive.in","r",stdin);
freopen("archive.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&x);
px[i]=px[i-1]^x;
}
timer=n+1;
for(int t=1;t<=timer;t++){
addRoot(rt[t]);
addTrie(rt[t],rt[t-1],px[t-1],B-1);
}
for(int i=1;i<=m;i++){
scanf(" %c",&op);
if(op=='A'){
scanf("%d",&v);
n++;
px[n]=px[n-1]^v;
timer++;
addRoot(rt[timer]);
addTrie(rt[timer],rt[timer-1],px[timer-1],B-1);
}
else{
scanf("%d %d %d",&l,&r,&v);
v^=px[n];
cout<<query(rt[r],rt[l-1],v,B-1)<<endl;
}
}
return 0;
}