#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1100005;
int ck,root,t1,t2,t3,seed=1;
struct fhq{
int ls,rs,sz;
ll key,val;
}tr[maxn];
inline int xj(int v){
tr[++ck]={0,0,1,rand(),v};
return ck;
}
inline void pushup(int u){
tr[u].sz=tr[tr[u].ls].sz+tr[tr[u].rs].sz+1;
return;
}
void split(int u,int v,int &x,int &y){
if(!u){
x=y=0;
return;
}
if(tr[u].val>v){
y=u;
split(tr[u].ls,v,x,tr[u].ls);
}
else{
x=u;
split(tr[u].rs,v,tr[u].rs,y);
}
pushup(u);
return;
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tr[x].key>tr[y].key){
tr[x].rs=merge(tr[x].rs,y);
pushup(x);
return x;
}
else{
tr[y].ls=merge(x,tr[y].ls);
pushup(y);
return y;
}
}
void insert(int v){
split(root,v,t1,t2);
root=merge(merge(t1,xj(v)),t2);
}
void erace(int v){
split(root,v,t1,t2);
split(t1,v-1,t2,t3);
t3=merge(tr[t3].ls,tr[t3].rs);
root=merge(merge(t1,t3),t2);
}
int find_rank(int x){
split(root,x-1,t1,t2);
int ans=tr[t1].sz+1;
root=merge(t1,t2);
return ans;
}
ll kth(int k){
int u=root;
while(u){
int tmp=tr[tr[u].ls].sz+1;
if(k==tmp){
break;
}
else if(k<tmp){
u=tr[u].ls;
}
else{
u=tr[u].rs;
k-=tmp;
}
}
return tr[u].val;
}
ll pre(int x){
split(root,x-1,t1,t2);
int u=t1;
while(tr[u].rs){
u=tr[u].rs;
}
root=merge(t1,t2);
return tr[u].val;
}
ll next(int x){
split(root,x,t1,t2);
int u=t2;
while(tr[u].ls){
u=tr[u].ls;
}
root=merge(t1,t2);
return tr[u].val;
}
inline int read(){
int num=0;
char c;
c=getchar();
while(c<'0'||c>'9'){
c=getchar();
}
while(c>='0'&&c<='9'){
num=num*10+c-48;
c=getchar();
}
return num;
}
int main(){
int a,flag,x,n,m,ans=0,last=0;
n=read();
m=read();
srand(11);
for(int i=1;i<=n;++i){
a=read();
insert(a);
}
for(int i=1;i<=m;++i){
flag=read();
x=read()^last;
if(flag==1){
insert(x);
}
else if(flag==2){
erace(x);
}
else if(flag==3){
last=find_rank(x);
ans^=last;
}
else if(flag==4){
last=kth(x);
ans^=last;
}
else if(flag==5){
last=pre(x);
ans^=last;
}
else if(flag==6){
last=next(x);
ans^=last;
}
}
cout<<ans;
}