#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int father[N],son[N][2],val[N],size[N],root,tot,pos[N];
int n,m,a,b;
char s[5];
inline int R()
{
char c;int f=0,i=1;
for(c=getchar();(c<‘0‘||c>‘9‘)&&(c!=‘-‘);c=getchar());
if(c==‘-‘)
i=-1,c=getchar();
for(;c<=‘9‘&&c>=‘0‘;c=getchar())
f=(f<<3)+(f<<1)+c-‘0‘;
return f*i;
}
inline void clear(int now)
{
father[now]=son[now][0]=son[now][1]=size[now]=0;
}
inline void update(int now)
{
if(now)
{
size[now]=1;
if(son[now][0]) size[now]+=size[son[now][0]];
if(son[now][1]) size[now]+=size[son[now][1]];
}
}
inline int get(int now)
{
return son[father[now]][1]==now;
}
inline void rotate(int now)
{
int fa=father[now],ofa=father[fa],which=get(now);
son[fa][which]=son[now][which^1],father[son[fa][which]]=fa;
son[now][which^1]=fa,father[fa]=now,father[now]=ofa;
if(ofa) son[ofa][son[ofa][1]==fa]=now;
update(fa),update(now);
}
inline void splay(int now,int to)
{
while(father[now]!=to)
{
if(father[father[now]]!=to) rotate(get(now)==get(father[now])?father[now]:now);
rotate(now);
}
if(!to) root=now;
}
inline void build(int x)
{
int now=root,last=0;
while(true)
{
if(!now)
{
now=++tot;father[now]=last;size[now]=1;val[now]=x;pos[x]=now;
if(last) son[last][1]=now;update(last);
splay(now,0);
break;
}
last=now;
now=son[now][1];
}
}
inline int find(int x) //找到第x本的编号
{
int now=root;
while(true)
{
if(x<=size[son[now][0]]) now=son[now][0];
else
{
int temp=size[son[now][0]]+1;
if(x==temp) {return val[now];}
x-=temp;now=son[now][1];
}
}
}
inline int pre()
{
int now=son[root][0];
while(son[now][1]) now=son[now][1];
return now;
}
inline int next()
{
int now=son[root][1];
while(son[now][0]) now=son[now][0];
return now;
}
inline void Delete(int x) //找到编号为x的书将其删除
{
splay(pos[x],0);
if(!son[root][0]){int oldroot=root;root=son[root][1];father[root]=0;clear(oldroot);return;}
if(!son[root][1]){int oldroot=root;root=son[root][0];father[root]=0;clear(oldroot);return;}
else
{
int leftbig=pre(),oldroot=root;
splay(leftbig,0);
son[root][1]=son[oldroot][1];
father[son[root][1]]=root;
update(root);clear(oldroot);
return;
}
}
inline void findtop()//找到最上面的书并将其旋转至根节点
{
int now=root;
while(son[now][0]) now=son[now][0];
splay(now,0);
}
inline void findbot()
{
int now=root;
while(son[now][1]) now=son[now][1];
splay(now,0);
}
inline void inserttop(int x) //把x放在书的最上面
{
Delete(x);findtop();
son[root][0]=pos[x];
father[pos[x]]=root;size[pos[x]]=1;son[pos[x]][0]=son[pos[x]][1]=0;
update(root);
}
inline void insertbot(int x) //把x放在书的最下面
{
Delete(x);findbot();
son[root][1]=pos[x];
father[pos[x]]=root;size[pos[x]]=1;son[pos[x]][0]=son[pos[x]][1]=0;
update(root);
}
int main()
{
//freopen("a.in","r",stdin);
n=R(),m=R();
for(int i=1;i<=n;i++)
a=R(),build(a);
while(m--)
{
scanf("%s",s);
if(s[0]==‘T‘) {a=R();inserttop(a);}
if(s[0]==‘B‘) {a=R();insertbot(a);}
if(s[0]==‘I‘)
{
a=R(),b=R();
if(!b) continue;
else
{
splay(pos[a],0);int temp,flag=0;
if(b==0) continue;
if(b==-1) temp=pre();
if(b==1) temp=next();
int t1=val[temp],t2=pos[a];
swap(pos[t1],pos[a]);
swap(val[t2],val[temp]);
}
}
if(s[0]==‘A‘)
{
a=R();splay(pos[a],0);
if(!son[root][0])
cout<<"0"<<endl;
else
cout<<size[son[root][0]]<<endl;
}
if(s[0]==‘Q‘)
a=R(),cout<<find(a)<<endl;
}
return 0;
}