#include<bits/stdc++.h>
using namespace std;
int n;
struct node
{
int lc,rc;
int val,fix,siz;
};
int ts=0,root=0;
node fhqt[100005];
int ans=0,last=0;
void new_node(int x)
{
++ts;
fhqt[ts].siz=1;
fhqt[ts].lc=fhqt[ts].rc=0;
fhqt[ts].val=x,fhqt[ts].fix=rand();
return ;
}
void pushup(int u)
{
fhqt[u].siz=fhqt[fhqt[u].lc].siz+fhqt[fhqt[u].rc].siz+1;
return;
}
void split(int u,int x,int &l,int &r)
{
if(u==0)
{
l=r=0;
return ;
}
if(fhqt[u].val<=x)
{
l=u;
split(fhqt[u].rc,x,fhqt[u].rc,r);
}
else
{
r=u;
split(fhqt[u].lc,x,l,fhqt[u].lc);
}
pushup(u);
return ;
}
int merge(int l,int r)
{
if(l==0||r==0)
{
return l+r;
}
if(fhqt[l].fix>fhqt[r].fix)
{
fhqt[l].rc=merge(fhqt[l].rc,r);
pushup(l);
return l;
}
else
{
fhqt[r].lc=merge(l,fhqt[r].lc);
pushup(r);
return r;
}
}
int insert(int x)
{
int l,r;
split(root,x,l,r);
new_node(x);
root=merge(merge(l,ts),r);
return ts;
}
int dlt(int x)
{
int l,m,r;
split(root,x,l,r);
split(l,x-1,l,m);
m=merge(fhqt[m].lc,fhqt[m].rc);
root=merge(merge(l,m),r);
return root;
}
int getRank(int x)
{
int l,r,res;
split(root,x-1,l,r);
res=fhqt[l].siz+1;
root=merge(l,r);
return res;
}
int getNum(int u,int k)
{
if(k==fhqt[fhqt[u].lc].siz+1) return u;
if(k<=fhqt[fhqt[u].lc].siz) return getNum(fhqt[u].lc,k);
return getNum(fhqt[u].rc,k-fhqt[fhqt[u].lc].siz-1);
}
int pre(int x)
{
int l,r,res;
split(root,x-1,l,r);
res=fhqt[getNum(l,fhqt[l].siz)].val;
root=merge(l,r);
return res;
}
int suc(int x)
{
int l,r,res;
split(root,x,l,r);
res=fhqt[getNum(r,1)].val;
root=merge(l,r);
return res;
}
int m;
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
int iiii;
cin>>iiii;
insert(iiii);
}
while(n--)
{
int opt,x;
cin>>opt>>x;
x^=last;
if(opt==1)
{
insert(x);
}
if(opt==2)
{
dlt(x);
}
if(opt==3)
{
last=getRank(x);
ans^=last;
}
if(opt==4)
{
last=fhqt[getNum(root,x)].val;
ans^=last;
}
if(opt==5)
{
last=pre(x);
ans^=last;
}
if(opt==6)
{
last=suc(x);
ans^=last;
}
}
cout<<ans<<endl;
return 0;
}