#include<bits/stdc++.h>
using namespace std;
const int MAXN=80005;
int cnt=0,rt=0,n,m,id[80005];
mt19937 rnd;
struct Treap{
int l,r,x,p,sz,f;
}t[80005];
inline void newnode(int x){
t[++cnt].x=x;
t[cnt].p=rnd();
t[cnt].f=t[cnt].l=t[cnt].r=0;
t[cnt].sz=1;
}
inline void pushup(int x){
t[x].sz=1;
if(t[x].l)
t[x].sz+=t[t[x].l].sz,t[t[x].l].f=x;
if(t[x].r)
t[x].sz+=t[t[x].r].sz,t[t[x].r].f=x;
}
void split(int x,int w,int &l,int &r){
if(!x)
return (void)(l=r=0);
if(t[t[x].l].sz+1<=w)
l=x,split(t[x].r,w,t[x].r,r);
else
r=x,split(t[x].l,w,l,t[x].l);
pushup(x);
}
int merge(int l,int r){
if(!l||!r)
return l|r;
if(t[l].p>t[r].p){
t[l].r=merge(t[l].r,r);
pushup(l);
return l;
}else{
t[r].l=merge(l,t[r].l);
pushup(r);
return r;
}
}
void insert(int x){
int l,r;
split(rt,cnt,l,r);
newnode(x);
rt=merge(merge(l,cnt),r);
id[x]=cnt;
}
int findk(int x){
int reans=1+t[t[x].l].sz;
while(x&&t[x].f){
if(x==t[t[x].f].r)
reans+=t[t[t[x].f].r].sz+1;
x=t[x].f;
}
return reans;
}
string op;
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin>>n>>m;
for(int i=1,t;i<=n;i++)
cin>>t,insert(t);
for(int i=1,s,tmp,rk,lm,rm,l,r;i<=m;i++){
cin>>op>>s;
rk=findk(id[s]);
switch(op[0]){
case 'T':
split(rt,rk,l,r);
split(l,rk-1,l,lm);
rt=merge(merge(lm,l),r);
break;
case 'B':
split(rt,rk,l,r);
split(l,rk-1,l,lm);
rt=merge(merge(l,r),lm);
break;
case 'I':
cin>>tmp;
if(tmp<0){
split(rt,rk,l,r);
split(l,rk-1,l,rm);
split(l,rk-2,l,lm);
rt=merge(merge(merge(l,rm),lm),r);
}if(tmp>0){
split(rt,rk,l,r);
split(l,rk-1,l,lm);
split(r,1,rm,r);
rt=merge(merge(merge(l,rm),lm),r);
}break;
case 'A':
cout<<rk-1<<'\n';
break;
case 'Q':
split(rt,rk,l,r);
split(l,rk-1,l,lm);
cout<<t[lm].x<<'\n';
rt=merge(merge(l,lm),r);
}
}
return 0;
}