#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
int n,p,opt,x,cnt,rt,m,a,b,c,d,t[N][2],siz[N],v[N],key[N],lst,ans;
int new_node(int a){
siz[++cnt]=1;
v[cnt]=a;
key[cnt]=rand();
return cnt;
}
void push_up(int m){
siz[m]=siz[t[m][0]]+siz[t[m][1]]+1;
return;
}
int merge(int a,int b){
if(!a || !b) return a+b;
if(key[a]>key[b]){
t[b][0]=merge(a,t[b][0]);
push_up(b);
return b;
}else{
t[a][1]=merge(t[a][1],b);
push_up(a);
return a;
}
}
void split(int cur,int k,int &a,int &b){
if(!cur){
a=b=0;
return;
}
if(v[cur]<=k){
a=cur;
split(t[cur][1],k,t[a][1],b);
}else{
b=cur;
split(t[cur][0],k,a,t[b][0]);
}
push_up(cur);
return;
}
int kth(int cur,int k){
m=t[cur][0];
if(siz[m]+1==k) return cur;
if(siz[m]+1<k) return kth(t[cur][1],k-siz[m]-1);
if(siz[m]+1>k) return kth(m,k);
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>m;
split(rt,m,a,b);
rt=merge(merge(a,new_node(m)),b);
}
while(p--){
cin>>opt>>x;
x^=lst;
if(opt==1){
split(rt,x,a,b);
rt=merge(merge(a,new_node(x)),b);
}else if(opt==2){
split(rt,x,a,b);
split(a,x-1,a,c);
rt=merge(merge(a,merge(t[c][0],t[c][1])),b);
}else if(opt==3){
split(rt,x-1,a,b);
lst=siz[a]+1;
rt=merge(a,b);
}else if(opt==4){
a=kth(rt,x);
lst=v[a];
}else if(opt==5){
split(rt,x-1,a,b);
c=kth(a,siz[a]);
rt=merge(a,b);
lst=v[c];
}else if(opt==6){
split(rt,x,a,b);
c=kth(b,1);
rt=merge(a,b);
lst=v[c];
}
if(opt>=3) ans^=lst;
}
cout<<ans;
return 0;
}