#include<bits/stdc++.h>
using namespace std;
#define int long long
#define min(a,b) (a<b?a:b)
#define P pair<int,int>
#define x first
#define y second
#define rd read()
#define modd(x) (((x)%mod+mod)%mod)
#define rd read()
#define lowbit(x) ((x)&(-x))
inline int read(int u=0, char c=getchar(), bool f=false){
for (;!isdigit(c);c=getchar()) f|=c=='-';
for (;isdigit(c);c=getchar()) u=(u<<1)+(u<<3)+c-'0';
return f?-u:u;
}
inline void wt(int x){
if(x<0) x=-x,putchar('-');
if(x>9) wt(x/10);
putchar(x%10+48);
}
inline void wt(int x,char c){wt(x),putchar(c);}
const int inf=~0U>>1,linf=~0ULL>>1;
const int N=1e6+10;
struct node{
int fa,son[2],v,cnt,siz;
}tr[N];
int n,m,root,cnt,ans,lastans;
void pushup(int x){tr[x].siz=tr[tr[x].son[1]].siz+tr[tr[x].son[0]].siz+tr[x].cnt;}
void rotate(int x){
int y=tr[x].fa,z=tr[y].fa;
int k=tr[y].son[1]==x;
tr[y].son[k]=tr[x].son[k^1];
tr[tr[x].son[k^1]].fa=y;
tr[x].son[k^1]=y;
tr[y].fa=x;
tr[z].son[tr[z].son[1]==y]=x;
tr[x].fa=z;
pushup(y),pushup(x);
}
void splay(int x,int k){
while(tr[x].fa!=k){
int y=tr[x].fa,z=tr[y].fa;
if(z!=k) (tr[y].son[0]==x)^(tr[z].son[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(k==0) root=x;
}
void find(int v){
int x=root;
while(tr[x].son[v>tr[x].v]&&v!=tr[x].v) x=tr[x].son[v>tr[x].v];
splay(x,0);
}
int get_pre(int v){
find(v);
int x=root;
if(tr[x].v<v) return x;
x=tr[x].son[0];
while(tr[x].son[1]) x=tr[x].son[1];
splay(x,0);
return x;
}
int get_suc(int v){
find(v);
int x=root;
if(tr[x].v>v) return x;
x=tr[x].son[1];
while(tr[x].son[0]) x=tr[x].son[0];
splay(x,0);
return x;
}
void del(int v){
int pre=get_pre(v),suc=get_suc(v);
splay(pre,0),splay(suc,pre);
int del=tr[suc].son[0];
if(tr[del].cnt>1) tr[del].cnt--,splay(del,0);
else tr[suc].son[0]=0,splay(suc,0);
}
void insert(int v){
int x=root,p=0;
while(x&&tr[x].v!=v) p=x,x=tr[x].son[v>tr[x].v];
if(x) tr[x].cnt++;
else{
x=++cnt;
tr[p].son[v>tr[p].v]=x;
tr[x].fa=p,tr[x].v=v,tr[x].cnt=tr[x].siz=1;
}
splay(x,0);
}
int get_rank(int v){
insert(v);find(v);
int res=tr[tr[root].son[0]].siz;
del(v);
return res;
}
int get_val(int k){
int x=root;
while(1){
int y=tr[x].son[0];
if(tr[y].siz+tr[x].cnt<k) k-=tr[y].siz+tr[x].cnt,x=tr[x].son[1];
else if(tr[y].siz>=k) x=tr[x].son[0];
else break;
}
splay(x,0);
return tr[x].v;
}
main(){
insert(-1e9),insert(1e9);
n=rd;m=rd;
for(int i=1;i<=n;i++){
int x=rd;
insert(x);
}
while(m--){
int op=rd,x=rd^lastans;
if(op==1) insert(x);
if(op==2) del(x);
if(op==3) lastans=get_rank(x);
if(op==4) lastans=get_val(x+1);
if(op==5) lastans=tr[get_pre(x)].v;
if(op==6) lastans=tr[get_suc(x)].v;
if(op!=1&&op!=2) ans^=lastans;
}
wt(ans,'\n');
return 0;
}