明天就要正式开始省选之后的康复训练了呢,毕竟距离ctsc就只有那么几天了qaq(感觉自己药丸)
这题还需要前缀和一下…求a[p]^a[p+1]^…^a[n]^x最大,就相当于是求sum[p-1]^sum[n]^x最大。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 600010
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*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,rt[N],sum,bin[30],owo=0;
char op[5];
struct node{
int son[2],sz;
}tr[N*30];
inline void ins(int &root,int val){
tr[++owo]=tr[root];root=owo;int p=owo;tr[p].sz++;
for(int i=23;i>=0;--i){
bool op=val&bin[i];
tr[++owo]=tr[tr[p].son[op]];tr[p].son[op]=owo;p=owo;tr[p].sz++;
}
}
inline int ask(int p1,int p2,int val){
int res=0;
for(int i=23;i>=0;--i){
bool op=val&bin[i];op^=1;
int sz=tr[tr[p2].son[op]].sz-tr[tr[p1].son[op]].sz;
if(sz>=1) res|=bin[i],p1=tr[p1].son[op],p2=tr[p2].son[op];
else p1=tr[p1].son[op^1],p2=tr[p2].son[op^1];
}return res;
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();bin[0]=1;
for(int i=1;i<=23;++i) bin[i]=bin[i-1]<<1;
ins(rt[0],0);
for(int i=1;i<=n;++i){
sum^=read();rt[i]=rt[i-1];ins(rt[i],sum);
}while(m--){
scanf("%s",op+1);
if(op[1]=='A'){
sum^=read();++n;rt[n]=rt[n-1];ins(rt[n],sum);
}else{
int l=read()-1,r=read()-1,x=read()^sum;
printf("%d\n",ask(l?rt[l-1]:0,rt[r],x));
}
}return 0;
}