#include<bits/stdc++.h>
#define eps 1e-7
#define maxn 660010
#define double long double
using namespace std;
int n,m,root,cnt;mt19937 rnd(time(0));
struct FHQ_treap{double val;unsigned long long key;int lson,rson,siz,id;}treap[maxn];
double value[maxn],maxx,minx;
void addnode(double val,int id){
treap[++cnt].val=val;
treap[cnt].id=id;
treap[cnt].lson=treap[cnt].rson=0;
treap[cnt].siz=1;
treap[cnt].key=rnd();
return;
}
void update(int id){
treap[id].siz=treap[treap[id].lson].siz+treap[treap[id].rson].siz+1;
return;
}
int merge(int l,int r){
if(!l||!r)return l+r;
if(treap[l].key<treap[r].key){
treap[r].lson=merge(l,treap[r].lson);
update(r);
return r;
}
else{
treap[l].rson=merge(treap[l].rson,r);
update(l);
return l;
}
}
void spilt(int now,double val,int &x,int &y){
if(!now){x=y=0;return;}
if(treap[now].val<=val){
x=now;
spilt(treap[now].rson,val,treap[now].rson,y);
update(x);
}
else{
y=now;
spilt(treap[now].lson,val,x,treap[now].lson);
update(y);
}
return;
}
void insert(double val,int uid){
int x,y;x=y=0;
spilt(root,val,x,y);
addnode(val,uid);
root=merge(merge(x,cnt),y);
return;
}
void del(double val){
int x,y,z;x=y=z=0;
spilt(root,val,x,z);
spilt(x,val-eps,x,y);
y=merge(treap[y].lson,treap[y].rson);
root=merge(merge(x,y),z);
return;
}
int find_by_id(int now,int id){
if(!now)return -1;
if(treap[now].val==value[id])return now;
else if(treap[now].val<value[id])return find_by_id(treap[now].rson,id);
else return find_by_id(treap[now].rson,id);
}
int Val_to_Rank(double val){
int lt,rt;lt=rt=0;
spilt(root,val-eps,lt,rt);
int res=treap[lt].siz+1;
root=merge(lt,rt);
return res;
}
int Rank_to_Id(int now,int ranking){
if(treap[treap[now].lson].siz+1==ranking)return treap[now].id;
else if(treap[treap[now].lson].siz+1<ranking)
return Rank_to_Id(treap[now].rson,ranking-treap[treap[now].lson].siz-1);
else
return Rank_to_Id(treap[now].lson,ranking);
}
double Rank_to_Val(int now,int ranking){
if(treap[treap[now].lson].siz+1==ranking)return treap[now].val;
else if(treap[treap[now].lson].siz+1<ranking)
return Rank_to_Val(treap[now].rson,ranking-treap[treap[now].lson].siz-1);
else
return Rank_to_Val(treap[now].lson,ranking);
}
void Top(int s){
int place=find_by_id(root,s);
double pre=value[s];
value[s]=minx-1.0;minx-=1.0;
del(pre);
insert(value[s],s);
return;
}
void Bottom(int s){
int place=find_by_id(root,s);
double pre=value[s];
value[s]=maxx+1.0;maxx+=1.0;
del(pre);
insert(value[s],s);
return;
}
void Insert(int s,int t){
if(t==0)return;
int rks=Val_to_Rank(value[s]);
double nxt=Rank_to_Val(root,rks+t);
del(value[s]);
if(t>0)value[s]=nxt+eps*2;
else if(t<0)value[s]=nxt-eps*2;
insert(value[s],s);
return;
}
int Ask(int s){return Val_to_Rank(value[s])-1;}
int Query(int s){return Rank_to_Id(root,s);}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;minx=101.00;maxx=n+100.00;
for(int i=1;i<=n;++i){
int p;cin>>p;
value[p]=i*1.0+100.00;
insert(value[p],p);
}
while(m--){
string op;cin>>op;
if(op=="Top"){int s;cin>>s;Top(s);}
else if(op=="Bottom"){int s;cin>>s;Bottom(s);}
else if(op=="Insert"){int s,t;cin>>s>>t;Insert(s,t);}
else if(op=="Ask"){int s;cin>>s;cout<<Ask(s)<<'\n';}
else {int s;cin>>s;cout<<Query(s)<<'\n';}
}
return 0;
}