#include <bits/stdc++.h>
#define int long long
#define lid tr[id].lson
#define rid tr[id].rson
using namespace std;
const int maxn=1e6+10;
namespace treap{
mt19937 rnd(time(0));
struct trep{
int lson,rson;
int val,fixed;
int cnt,siz;
}tr[maxn]; int treap_cnt;
void left_round(int &id){
int rt=rid; rid=tr[rt].lson;
tr[rt].lson=id; tr[rt].siz=tr[id].siz;
tr[id].siz=tr[lid].siz+tr[rid].siz+tr[id].cnt; id=rt;
}
void right_round(int &id){
int rt=lid; lid=tr[rt].rson;
tr[rt].rson=id; tr[rt].siz=tr[id].siz;
tr[id].siz=tr[lid].siz+tr[rid].siz+tr[id].cnt; id=rt;
}
bool treap_cmp(int id1,int id2){return tr[id1].fixed<tr[id2].fixed;}
void insert(int &id,int x){
if(id==0){
id=++treap_cnt; tr[id].val=x; tr[id].fixed=rnd()%LLONG_MAX;
tr[id].cnt=tr[id].siz=1; return ;
}
tr[id].siz++;
if(x==tr[id].val){tr[id].cnt++; return ;}
if(x<tr[id].val){
insert(lid,x);
if(treap_cmp(lid,id)) right_round(id);
}
else{
insert(rid,x);
if(treap_cmp(rid,id)) left_round(id);
}
}
void erase(int &id,int x){
if(id==0) return ;
if(tr[id].val==x){
if(tr[id].cnt>1){tr[id].cnt--;tr[id].siz--;return;}
if(lid*rid==0) id=lid+rid;
else{
if(treap_cmp(lid,id)){right_round(id); erase(id,x);}
else{left_round(id); erase(id,x);}
}
}
else if(x<tr[id].val){tr[id].siz--; erase(lid,x);}
else{tr[id].siz--; erase(rid,x);}
}
int ask_rank_pre(int id,int x){
if(id==0) return 0;
if(x==tr[id].val) return tr[lid].siz;
if(x<tr[id].val) return ask_rank_pre(lid,x);
else return tr[lid].siz+tr[id].cnt+ask_rank_pre(rid,x);
}
int ask_rank_nex(int id,int x){
if(id==0) return 0;
if(x==tr[id].val) return tr[lid].siz+tr[id].cnt;
if(x<tr[id].val) return ask_rank_nex(lid,x);
else return tr[lid].siz+tr[id].cnt+ask_rank_nex(rid,x);
}
int ask_value(int &id,int x){
if(id==0) return 0;
if(x<=tr[lid].siz) return ask_value(lid,x);
else if(x<=tr[lid].siz+tr[id].cnt) return tr[id].val;
else return ask_value(rid,x-tr[lid].siz-tr[id].cnt);
}
}using namespace treap;
int n,m,rot;
int a[maxn];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);int ans;
cin>>n>>m; int op,l=0,x; ans=0;
for(int i=1;i<=n;i++) cin>>a[i];
while(m--){
cin>>op>>x; x^=l;
if(op==1) insert(rot,x);
else if(op==2) erase(rot,x);
else if(op==3) l=ask_rank_pre(rot,x)+1;
else if(op==4) l=ask_value(rot,x);
else if(op==5) l=ask_value(rot,ask_rank_pre(rot,x));
else if(op==6) l=ask_value(rot,ask_rank_nex(rot,x)+1);
if(op>=3) ans^=l;
}cout<<ans<<endl;
return 0;
}