#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+90,inf=1e16;
ll n,m,a[N],f[N];
struct node{
node *ls,*rs;
ll val,sum_cnt,size,rank;
}tr[N<<2];
node *root,*null=tr+0;
ll tot;
node *newnode(ll val){
tot++;
tr[tot].size=tr[tot].sum_cnt=1,tr[tot].val=val,tr[tot].rank=rand();
tr[tot].ls=tr[tot].rs=null;
return tr+tot;
}
void upds(node *&x){
x->size=x->sum_cnt;
if(x->ls!=null) x->size+=x->ls->size;
if(x->rs!=null) x->size+=x->rs->size;
}
void build(){
node *x=newnode(inf),*y=newnode(-inf);
if(x->rank<y->rank){
root=x;
root->ls=y;
}
else{
root=y;
root->rs=x;
}
upds(root);
}
void zag(node *&x,node *&y){
node *tmp=x;
y->ls=tmp->rs;
tmp->rs=y;
upds(y),upds(tmp);
y=tmp;
}
void zig(node *&x,node *&y){
node *tmp=x;
y->rs=tmp->ls;
tmp->ls=y;
upds(y),upds(tmp);
y=tmp;
}
void insert(node *&now,ll val){
if(now==null){
now=newnode(val);
return ;
}
if(now->val==val){
now->size++,now->sum_cnt++;
return ;
}
if(now->val>val){
insert(now->ls,val);
if(now->rank>now->ls->rank) zag(now->ls,now);
}
else{
insert(now->rs,val);
if(now->rank>now->rs->rank) zig(now->rs,now);
}
upds(now);
return ;
}
void delet(node *&now,ll val){
if(now->val==val){
if(now->sum_cnt>1) now->sum_cnt--,now->size--;
else{
bool L=(now->ls!=null),R=(now->rs!=null);
if((!L)&&(!R)) now=null;
else if((!L)&&R) now=now->rs;
else if(L&&(!R)) now=now->ls;
else{
bool po=(now->ls->rank<now->rs->rank);
if(po) zag(now->ls,now);
else zig(now->rs,now);
delet((po ? now->rs : now->ls),val);
}
upds(now);
}
return ;
}
if(now->val>val) delet(now->ls,val);
else delet(now->rs,val);
upds(now);
return ;
}
ll sumK(node *now,ll val){
if(now==null) return 0;
if(now->val<val) return now->ls->size+now->sum_cnt+sumK(now->rs,val);
else if(now->val==val) return now->ls->size;
else return sumK(now->ls,val);
}
ll findK(node *now,ll k){
if(now->ls->size>=k) return findK(now->ls,k);
else if(now->ls->size+now->sum_cnt>=k) return now->val;
else return findK(now->rs,k-now->ls->size-now->sum_cnt);
}
ll prep(node *now,ll val,ll op){
if(now==null) return op;
else if(now->val<val) return prep(now->rs,val,now->val);
else return prep(now->ls,val,op);
}
ll succ(node *now,ll val,ll op){
if(now==null) return op;
else if(now->val>val) return succ(now->ls,val,now->val);
else return succ(now->rs,val,op);
}
void dfs(node *now){
if(now==null) return ;
cout<<now->val<<" "<<now->ls->val<<" "<<now->rs->val<<" "<<now->sum_cnt<<" "<<now->size<<"\n";
dfs(now->ls),dfs(now->rs);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
srand(0);
build();
cin>>n>>m;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
insert(root,x);
}
ll ans=0,tans=0;
for(int i=1;i<=m;i++){
ll op,x;
cin>>op>>x;
x^=ans;
if(op==1) insert(root,x);
else if(op==2) delet(root,x);
else if(op==3) ans=sumK(root,x);
else if(op==4) ans=findK(root,x+1);
else if(op==5) ans=prep(root,x,0);
else ans=succ(root,x,0);
if(op!=1&&op!=2) tans^=ans;
}
cout<<tans;
return 0;
}
提交记录