可持久化trie
说实话,可持久化的数据结构细节就是麻烦- -(其实是我太弱了),我调了差不多两个小时才调出来。。。
#include<cstdio>
#define N 600005
#define D 25
using namespace std;
struct node
{
node *ch[2];
int cnt;
}*root[N], nodes[N*40], *null;
int nodecnt;
char cmd[3];
void init()
{
root[0]=null=&nodes[++nodecnt];
null->cnt=0;
null->ch[0]=null;
null->ch[1]=null;
for(int i = 1; i < N; i++)
root[i]=&nodes[++nodecnt];
}
void build(node *x, node *&y, int v, int d)
{
if(d<0)return;
int p=(v>>d)&1;
y->ch[p^1]=x->ch[p^1];
y->ch[p]=&nodes[++nodecnt];
y->ch[p]->cnt=x->ch[p]->cnt+1;
build(x->ch[p],y->ch[p],v,d-1);
}
int query(node *x, node *y, int v, int d)
{
if(d<0)return 0;
int p=(v>>d)&1;
if(y->ch[p^1]->cnt > x->ch[p^1]->cnt)return (1<<d)+query(x->ch[p^1],y->ch[p^1],v,d-1);
else return query(x->ch[p],y->ch[p],v,d-1);
}
int main()
{
int n, m, pre=0;
scanf("%d%d",&n,&m);
init();
for(int i = 1, a; i <= n; i++)
{
scanf("%d",&a);
build(root[i-1],root[i],pre,D);
pre^=a;
}
build(root[n],root[n+1],pre,D);n++;
for(int i = 1; i <= m; i++)
{
scanf("%s",cmd);
if(cmd[0]=='A')
{
int a;
scanf("%d",&a);
pre^=a;
build(root[n],root[n+1],pre,D);
n++;
}
else
{
int l, r, x;
scanf("%d%d%d",&l,&r,&x);
printf("%d\n",query(root[l-1],root[r],pre^x, D));
}
}
}