#include<bits/stdc++.h>
using namespace std;
int qlt,qnt;
struct no{
no *son[2];
int siz,rcnt,val,rank;
no(int val):val(val),rcnt(1),siz(1){
son[0]=son[1]=nullptr;
rank=rand();
}
void upd(){
siz=rcnt;
if(son[0]!=nullptr)siz+=son[0]->siz;
if(son[1]!=nullptr)siz+=son[1]->siz;
}
};
no* rt=nullptr;
void turn(no* &cur,bool f){
no* tmp=cur->son[f];
cur->son[f]=tmp->son[!f];
tmp->son[!f]=cur;
cur->upd(),tmp->upd();
cur=tmp;
}
void insert(no* &cur,int val){
if(cur==nullptr){
cur=new no(val);
return ;
}
if(val==cur->val){
cur->rcnt++;
cur->upd();
}else if(val<cur->val){
insert(cur->son[0],val);
if(cur->son[0]->rank<cur->rank){
turn(cur,0);
}
cur->upd();
}else{
insert(cur->son[1],val);
if(cur->son[1]->rank<cur->rank){
turn(cur,1);
}
cur->upd();
}
}
void del(no* &cur,int val){
if(cur==nullptr)return;
if(val<cur->val){
del(cur->son[0],val);
cur->upd();
return;
}
if(val>cur->val){
del(cur->son[1],val);
cur->upd();
return;
}
if(cur->rcnt>1){
//cout << "pass\n";
cur->rcnt--;
cur->siz--;
cur->upd();
return;
}
if(cur->son[0]==nullptr and cur->son[1]==nullptr){
cur=nullptr;
return;
}
if(cur->son[0]==nullptr and cur->son[1]!=nullptr){
no* tmp=cur->son[1];
delete cur;
cur=tmp;
cur->upd();
return;
}
if(cur->son[0]!=nullptr and cur->son[1]==nullptr){
no* tmp=cur->son[0];
delete cur;
cur=tmp;
cur->upd();
return;
}
if(cur->son[0]!=nullptr and cur->son[1]!=nullptr){
bool f=(cur->son[0]->rank<cur->son[1]->rank);
turn(cur,f);
del(cur->son[!f],val);
cur->upd();
return;
}
}
int get_rank(no* cur,int val){
if(cur==nullptr)return 0;
int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
if(val==cur->val){
return lsiz+1;
}
if(val<cur->val){
if(cur->son[0]!=nullptr){
return get_rank(cur->son[0],val);
}else{
return 1;
}
}
if(cur->son[1]!=nullptr){
return lsiz+cur->rcnt+get_rank(cur->son[1],val);
}else{
return cur->siz+1;
}
}
int get_val(no* cur,int rank){
if(cur==nullptr)return 0;
int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
if(rank<=lsiz){
return get_val(cur->son[0],rank);
}
if(rank<=lsiz+cur->rcnt){
return cur->val;
}
return get_val(cur->son[1],rank-cur->rcnt-lsiz);
}
int get_last(no* cur,int val){
if(cur==nullptr)return 0;
if(val<=cur->val){
if(cur->son[0]!=nullptr)return get_last(cur->son[0],val);
return 0;
}else{
qlt=cur->val;
if(cur->son[1]!=nullptr)get_last(cur->son[1],val);
return qlt;
}
}
int get_next(no* cur,int val){
if(cur==nullptr)return 0;
if(val>=cur->val){
if(cur->son[1]!=nullptr)return get_next(cur->son[1],val);
return 0;
}else{
qnt=cur->val;
if(cur->son[0]!=nullptr)get_next(cur->son[0],val);
return qnt;
}
}
int main(){
//freopen("P6136_11.in", "r", stdin);
int n,lst=0,ans=0,m;
cin>>m>>n;
for(int i=1;i<=m;i++){
int a;cin>>a;
insert(rt,a);
}
while(n--){
int opt,x;
cin>>opt>>x;
if(opt==1){
insert(rt,x^lst);
}
if(opt==2)del(rt,x^lst);
if(opt==3){
lst=get_rank(rt,x^lst);
ans^=lst;
}
if(opt==4){
lst=get_val(rt,x^lst);
ans^=lst;
}
if(opt==5){
lst=get_last(rt,x^lst);
ans^=lst;
}
if(opt==6){
lst=get_next(rt,x^lst);
ans^=lst;
}
}
cout<<ans;
return 0;
}
/*
5
1 2 5 4 3
*/
'''get_rank'''函数当整个平衡树为空时,应当返回1。
int get_rank(no* cur,int val){
if(cur==nullptr)return 1;//这里一定要返回1,因为当平衡树为空时,任意一个值的排名应该为1
int lsiz=(cur->son[0]==nullptr?0:cur->son[0]->siz);
if(val==cur->val){
return lsiz+1;
}
if(val<cur->val){
if(cur->son[0]!=nullptr){
return get_rank(cur->son[0],val);
}else{
return 1;
}
}
if(cur->son[1]!=nullptr){
return lsiz+cur->rcnt+get_rank(cur->son[1],val);
}else{
return cur->siz+1;
}
}