#include<bits/stdc++.h>
using namespace std;
template<typename T>void read(T &x){
x=0;int 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();}
x*=f;
}
template<typename T,typename ...Args>
void read(T &x,Args &...rest){read(x);read(rest...);}
const int N=1.1e6+5,INF=2147483647;
int n,m,last,ans;
int ls[N],rs[N],val[N],prio[N],cnt[N],siz[N],tot,root;
void push_up(int p){siz[p]=siz[ls[p]]+siz[rs[p]]+cnt[p];}
void L_rotate(int &p){
int fa=rs[p];
rs[p]=ls[fa];
ls[fa]=p;
push_up(p);
push_up(fa);
p=fa;
}
void R_rotate(int &p){
int fa=ls[p];
ls[p]=rs[fa];
rs[fa]=p;
push_up(p);
push_up(fa);
p=fa;
}
void insert(int &p,int x){
if(!p){
p=++tot;
val[tot]=x;
prio[tot]=rand();
cnt[tot]=siz[tot]=1;
return;
}
if(x<val[p]){
insert(ls[p],x);
if(prio[ls[p]]>prio[p])R_rotate(p);
}
else if(x>val[p]){
insert(rs[p],x);
if(prio[rs[p]]>prio[p])L_rotate(p);
}
else ++cnt[p];
push_up(p);
}
void remove(int &p,int x){
if(x==val[p]){
if(cnt[p]>1){
cnt[p]--;
siz[p]--;
return;
}
if(ls[p]||rs[p]){
if(!rs||prio[ls[p]]>prio[rs[p]])
R_rotate(p),remove(ls[p],x);
else L_rotate(p),remove(rs[p],x);
push_up(p);
}
else p=0;
}
else if(x<val[p])remove(ls[p],x);
else remove(rs[p],x);
push_up(p);
}
int Rank(int p,int x){
if(!p)return 1;
if(x<val[p])return Rank(ls[p],x);
if(x==val[p])return siz[ls[p]]+1;
return siz[ls[p]]+cnt[p]+Rank(rs[p],x);
}
int kth(int p,int x){
if(x<=siz[ls[p]])return kth(ls[p],x);
if(x<=siz[ls[p]]+cnt[p])return val[p];
return kth(rs[p],x-siz[ls[p]]-cnt[p]);
}
int precursor(int p,int x){
if(!p)return -INF;
int res;
if(x<=val[p])res=precursor(ls[p],x);
else{
res=precursor(rs[p],x);
if(res==-INF)res=val[p];
}
return res;
}
int successor(int p,int x){
if(!p)return INF;
int res;
if(x>=val[p])res=successor(rs[p],x);
else{
res=successor(ls[p],x);
if(res==INF)res=val[p];
}
return res;
}
int main(){
srand(time(0));
read(n,m);
for(int i=1,a;i<=n;i++){
read(a);
insert(root,a);
}
for(int i=1,op,x;i<=m;i++){
read(op,x);
x^=last;
if(op==1)insert(root,x);
if(op==2)remove(root,x);
if(op==3)last=Rank(root,x);
if(op==4)last=kth(root,x);
if(op==5)last=precursor(root,x);
if(op==6)last=successor(root,x);
if(op>2)ans^=last;
}
printf("%d",ans);
return 0;
}
记录