原版过了,加强版调了好久,本地能过来着(qwq(大雾
#include<bits/stdc++.h>
//#define int long long
#define inf 2147483647
using namespace std;
int tot,n,m,root,ans;
struct mjm{
int l,r,val,cnt,date,size;
#define ls(p) a[p].l
#define rs(p) a[p].r
}a[2000005];
inline int read()
{
int x=0;int f=0;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=1;
for(; isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
if(f)return -x;
return x;
}
void push_up(int p)
{
a[p].size=a[ls(p)].size+a[rs(p)].size+a[p].cnt;
}
int newn(int val)
{
a[++tot].val=val;
a[tot].date=rand();
a[tot].cnt=a[tot].size=1;
return tot;
}
void build()
{
newn(-inf);newn(inf);
root=1;a[1].r=2;
push_up(root);
}
int getrank(int p,int val)
{
if(!p)return 1;
if(a[p].val==val)return a[ls(p)].size+1;
if(a[p].val>val)return getrank(ls(p),val);
if(a[p].val<val)return getrank(rs(p),val)+a[ls(p)].size+a[p].cnt;
}
int getval(int p,int rank)
{
if(!p)return inf;
if(rank>a[ls(p)].size&&rank<=a[ls(p)].size+a[p].cnt)return a[p].val;
if(rank<=a[ls(p)].size)return getval(ls(p),rank);
return getval(rs(p),rank-a[ls(p)].size-a[p].cnt);
}
void zag(int &p)
{
int q=rs(p);
a[p].r=a[q].l;a[q].l=p;p=q;
push_up(p);push_up(ls(p));
}
int zig(int &p)
{
int q=ls(p);
a[p].l=a[q].r;a[q].r=p;p=q;
push_up(p);push_up(rs(p));
}
int getpre(int val)
{
int ans=1,p=root;
while(p){
if(a[p].val==val){
if(ls(p)){
p=ls(p);
while(rs(p))p=rs(p);
ans=p;
}
break;
}
if(val>a[p].val&&a[p].val>a[ans].val)ans=p;
p=val>a[p].val?rs(p):ls(p);
}
return a[ans].val;
}
int getnext(int val)
{
int ans=2,p=root;
while(p){
if(val==a[p].val){
if(rs(p)){
p=rs(p);
while(ls(p))p=ls(p);
ans=p;
}
break;
}
if(val<a[p].val&&a[p].val<a[ans].val)ans=p;
p=val>a[p].val?rs(p):ls(p);
}
return a[ans].val;
}
void insert(int &p,int val)
{
if(!p){p=newn(val);return;}
if(a[p].val==val){a[p].cnt++;push_up(p);return;}
if(a[p].val>val){
insert(ls(p),val);
if(a[ls(p)].date>a[p].date)zig(p);
}
if(a[p].val<val){
insert(rs(p),val);
if(a[rs(p)].date>a[p].date)zag(p);
}
push_up(p);
}
void erase(int &p,int val)
{
if(!p)return;
if(a[p].val==val){
if(a[p].cnt>1){a[p].cnt--;push_up(p);return;}
if(ls(p)||rs(p)){
if(!rs(p)||a[ls(p)].date>a[rs(p)].date){zig(p);erase(rs(p),val);}
else {zag(p);erase(ls(p),val);}
push_up(p);
}
else p=0;
return;
}
if(a[p].val>val)erase(ls(p),val);
if(a[p].val<val)erase(rs(p),val);
push_up(p);
}
int main()
{
//freopen("p6136_2.in","r",stdin);
register int i,op,x,last=0;
build();
n=read();m=read();
for(i=1;i<=n;i++){
x=read();
insert(root,x);
}
for(i=1;i<=m;i++){
op=read();x=read();
x=x^last;
//printf("%d %d\n\n",op,x);
if(op==1)insert(root,x);
if(op==2)erase(root,x);
if(op==3){
last=getrank(root,x)-1;ans^=last;
//printf("%d\n",last);
}
if(op==4){
last=getval(root,x+1);ans^=last;
//printf("%d\n",last);
}
if(op==5){
last=getpre(x);ans^=last;
//printf("%d\n",last);
}
if(op==6){
last=getnext(x);ans^=last;
//printf("%d\n",last);
}
}
printf("%d",ans);
}