模板题,刷点数据结构 ~
code:
#include <bits/stdc++.h>
#define N 600009
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int rt[N],sum[N],tot;
struct node
{
int ch[2],cnt;
}t[N*28];
void insert(int a,int b,int len,int num)
{
if(len<0) return;
int o=(num>>len)&1;
t[b].ch[o^1]=t[a].ch[o^1];
t[b].ch[o]=++tot;
t[t[b].ch[o]].cnt=t[t[a].ch[o]].cnt+1;
insert(t[a].ch[o],t[b].ch[o],len-1,num);
}
int query(int l,int r,int len,int x)
{
if(len<0) return 0;
int o=(x>>len)&1;
if(t[t[r].ch[o^1]].cnt>t[t[l].ch[o^1]].cnt)
{
return (1<<len)+query(t[l].ch[o^1],t[r].ch[o^1],len-1,x);
}
else
{
return query(t[l].ch[o],t[r].ch[o],len-1,x);
}
}
int main()
{
// setIO("input");
int i,j,n,m;
scanf("%d%d",&n,&m);
rt[0]=++tot;
insert(0,rt[0],25,0);
for(i=1;i<=n;++i)
{
int x;
scanf("%d",&x);
sum[i]=sum[i-1]^x;
rt[i]=++tot;
insert(rt[i-1],rt[i],25,sum[i]);
}
for(i=1;i<=m;++i)
{
char str[10];
scanf("%s",str);
if(str[0]=='A')
{
int b;
scanf("%d",&b);
++n;
sum[n]=sum[n-1]^b;
rt[n]=++tot;
insert(rt[n-1],rt[n],25,sum[n]);
}
else
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
--x,--y;
if(x==0) printf("%d\n",query(0,rt[y],25,z^sum[n]));
else printf("%d\n",query(rt[x-1],rt[y],25,z^sum[n]));
}
}
return 0;
}