傳送門
【題目分析】
emmmm,似乎是個最大異或和的模板?
先將第二個操作裏的式子轉一下,求a[p]^a[p+1]^....a[n]^x等價於前綴異或和sum[p-1]^sum[n]^x,後面兩個的異或值是一個定值,所以我們只用在[l,r]中找到使sum[p]^(sum[n]^x)最大的即可。
【代碼~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e7+10;
int n,q,x;
int pre;
int rt[MAXN],tot,siz[MAXN],son[MAXN][2];
inline char nc(){
static char buf[1000000],*p1=buf,*p2=buf;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),(p1==p2))?EOF:*p1++;
}
//#define getchar nc
inline int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void insert(int &root,int last,int num){
root=++tot;
siz[root]=siz[last]+1;
int now=root;
for(int i=30;i!=-1;--i){
int k=(num>>i)&1;
son[now][k]=++tot,son[now][k^1]=son[last][k^1];
siz[tot]=siz[son[last][k]]+1;
now=tot,last=son[last][k];
}
}
int query(int rt1,int rt2,int num){
int ret=0;
for(int i=30;i!=-1;--i){
int k=(num>>i)&1;
if(siz[son[rt2][k^1]]>siz[son[rt1][k^1]]) ret|=(1<<i),rt1=son[rt1][k^1],rt2=son[rt2][k^1];
else rt1=son[rt1][k],rt2=son[rt2][k];
}
return ret;
}
int main(){
n=Read()+1,q=Read();
insert(rt[1],rt[0],0);
for(int i=2;i<=n;++i){
pre=pre^Read();
insert(rt[i],rt[i-1],pre);
}
while(q--){
char cz[5];
scanf("%s",cz);
if(cz[0]=='A'){
++n;
pre=pre^Read();
insert(rt[n],rt[n-1],pre);
}
else{
int l=Read(),r=Read(),num=Read();
cout<<query(rt[l-1],rt[r],pre^num)<<'\n';
}
}
}