@[华恋_韵](/user/173510)
你能给自己的数组注释一下吗?
这样直接给代码 一般没人看(QAQ)
by 鬼·烨弑 @ 2020-06-18 16:21:58
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=6e5+10;
int n,m,r;
int a[3*N];
struct node{
int ch[2];
int num;
}t[N*40];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
struct tree{
int root[N];
int cnt;
tree(){
memset(root,0,sizeof root);
cnt=0;
}
int clone(int p)
{
++cnt;
t[cnt]=t[p];
return cnt;
}
int add(int p,int x ,int d)
{
p=clone(p);
t[p].num++;
if(d==-1)return p;
bool k=(x>>d)&1;
t[p].ch[k]=add(t[p].ch[k],x,d-1);
return p;
}
int find(int f1,int f2,int x,int d)
{
if(d==-1)return 0;
bool k=(x>>d)&1;
int ans=0;
if(t[t[f2].ch[!k]].num>t[t[f1].ch[!k]].num)ans+=(1<<d),ans+=find(t[f1].ch[!k],t[f2].ch[!k],x,d-1);
else ans+=find(t[f1].ch[k],t[f2].ch[k],x,d-1);
return ans;
}
}T;
int main()
{
n=read(),m=read(); T.root[r] = T.add(0,a[r],25);// !!!!!!!!!!!
for(r=1;r<=n;r++)
{
a[r]=read();
a[r]^=a[r-1];
T.root[r]=T.add(T.root[r-1],a[r],25);
}
r--;
while(m--)
{
char k[3];
int l,R,x;
scanf("%s",k);
switch(k[0])
{
case 'A':{
++r;
a[r]=read();
a[r]^=a[r-1];
T.root[r]=T.add(T.root[r-1],a[r],25);
break;
}
case 'Q':{
l=read(),R=read(),x=read();
x^=a[r];
if(l==1)printf("%d\n",T.find(0,T.root[R-1],x,25)); // !!!!!! T.root[0] --> 0
else printf("%d\n",T.find(T.root[l-2],T.root[R-1],x,25));
break;
}
}
}
return 0;
}
```
by 鬼·烨弑 @ 2020-06-18 16:53:40
谢谢大佬Orz
by 华恋_韵 @ 2020-06-18 16:57:13