样例过了 但全WA 得到的都是0
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define MAXN 20000100
#define node_cnt node_tot
#define node tot
using namespace std;
int trie[MAXN][2],size[MAXN],root[MAXN],node_tot,tot;
int n,m,sum;
inline int read()
{
int X(0),w(0);char ch(0);
while (!isdigit(ch))w|=ch=='-',ch=getchar();
while (isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<0) putchar('-'),x=-x;
if (x>9) write(x/10);
putchar(x%10+'0');
}
void insert(int x) {
int rt=root[node_tot]; //pre
root[++node_tot]=++tot;
for(int i=24;i>=0;i--) {
bool c=x&(1<<i);
size[tot]=size[rt]+1;
trie[tot][c^1]=trie[rt][c^1]; //继承
trie[tot][c]=++tot; //新点
rt=trie[rt][c];
}
size[tot]=size[rt]+1;
}
void query(int l,int r,int x) {
int cl=root[l],cr=root[r],answ=0;
for(int i=24;i>=0;i--) {
bool c=x&(1<<i);
if(size[trie[cr][c^1]]>size[trie[cl][c^1]]) { //这中间有节点 且是反的
cl=trie[cl][c^1]; cr=trie[cr][c^1];
answ|=1<<i;
} else {
cl=trie[cl][c]; cr=trie[cr][c];
}
}
write(answ);
putchar('\n');
}
int main() {
n=read(); m=read();
insert(0);
int x;
for(int i=1;i<=n;i++) {
x=read(); sum^=x;
insert(sum);
}
int l,r,y;char c;
for(int i=1;i<=m;i++) {
cin>>c;
if(c=='A') {
y=read();
sum^=y;
insert(sum);
} else {
l=read(); r=read(); y=read();
query(l-1,r,y^sum);
}
}
return 0;
}