#4错了,求助大佬帮帮QAQ,(马蜂自认为还可以)
#include<iostream>
#include<cstdio>
#include<ctime>
#include<string>
using namespace std;
const int N=1e6;
struct node{
int l,r,key,val,size,fa;
}fhq[N];
int n,m,cnt,pos[N],a[N],root;
int newnode(int val){
fhq[++cnt].key=rand();
fhq[cnt].size=1;
fhq[cnt].val=val;
return cnt;
}
void update(int now){
fhq[now].size=1;
if(fhq[now].l) fhq[now].size+=fhq[fhq[now].l].size,fhq[fhq[now].l].fa=now;
if(fhq[now].r) fhq[now].size+=fhq[fhq[now].r].size,fhq[fhq[now].r].fa=now;
}
void split(int now,int k,int &x,int &y){
if(!now) x=y=0;
else{
if(fhq[fhq[now].l].size<k){
x=now;
split(fhq[now].r,k-fhq[fhq[now].l].size-1,fhq[now].r,y);
}
else{
y=now;
split(fhq[now].l,k,x,fhq[now].l);
}
update(now);
}
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
else{
if(fhq[x].key<fhq[y].key){
fhq[x].r=merge(fhq[x].r,y);
update(x);
return x;
}
else{
fhq[y].l=merge(x,fhq[y].l);
update(y);
return y;
}
}
}
int getnum(int x){
int num=fhq[fhq[x].l].size+1;
while(fhq[x].fa){
if(x==fhq[fhq[x].fa].r){
num+=fhq[fhq[fhq[x].fa].l].size+1;
}
x=fhq[x].fa;
}
return num;
}
int x,y,z,w1,w2,w3,g;
int main(){
srand(time(0));
cin>>n>>m;
fhq[0].size=fhq[0].val=fhq[0].fa=0;
for(int i=1;i<=n;i++){
cin>>a[i];
pos[a[i]]=newnode(a[i]);
root=merge(root,pos[a[i]]);
}
while(m--){
string op;
int s,t;
cin>>op>>s;
if(op[0]=='T'){
int g=getnum(pos[s]);
split(root,g-1,x,y);
split(y,1,y,z);
root=merge(merge(y,x),z);
}
else if(op[0]=='B'){
int g=getnum(pos[s]);
split(root,g-1,x,y);
split(y,1,y,z);
root=merge(merge(x,z),y);
}
else if(op[0]=='I'){
cin>>t;
int g=getnum(pos[s]);
split(root,g-2,x,y);//x<=g-2,w1=g-1,w2=g,w3=g+1,y>=g+2;
split(y,1,w1,y);
split(y,1,w2,y);
split(y,1,w3,y);
if(t==-1){
root=merge(merge(merge(merge(x,w2),w1),w3),y);
}
else if(t==0){
root=merge(merge(merge(merge(x,w1),w2),w3),y);
}
else{
root=merge(merge(merge(merge(x,w1),w3),w2),y);
}
}
else if(op[0]=='A'){
int g=getnum(pos[s]);
cout<<g-1<<endl;
}
else{
split(root,s-1,x,y);
split(y,1,y,z);
cout<<fhq[y].val<<endl;
root=merge(merge(x,y),z);
}
}
return 0;
}