#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
map<int,int>s;
int n,m;
int x,y;
char ch[10];
int ls[100010];
int rs[100010];
int size[100010];
int f[100010];
int r[100010];
int v[100010];
int cnt;
int root;
int a,b,c,d;
int build(int val)
{
    int rt=++cnt;
    size[rt]=1;
    v[rt]=val;
    r[rt]=rand();
    return rt;
}
void pushup(int rt)
{
    size[rt]=size[ls[rt]]+size[rs[rt]]+1;
}
int merge(int x,int y)
{
    if(!x||!y)
    {
        return x+y;
    }
    if(r[x]<r[y])
    {
        rs[x]=merge(rs[x],y);
        f[rs[x]]=x;
        pushup(x);
        if(!rs[x])
        {
            f[rs[x]]=0;
        }
        return x;
    }
    else
    {
        ls[y]=merge(x,ls[y]);
        f[ls[y]]=y;
        pushup(y);
        if(!ls[y])
        {
            f[ls[y]]=0;
        }
        return y;
    }
}
void split1(int rt,int &a,int &b)
{
    int x=ls[rt];
    int y=rs[rt];
    ls[rt]=rs[rt]=0;
    size[rt]=1;
    while(f[rt])
    {
        if(rt==ls[f[rt]])
        {
            ls[f[rt]]=y;
            f[y]=f[rt];
            y=f[rt];
            pushup(f[rt]);
        }
        else
        {
            rs[f[rt]]=x;
            f[x]=f[rt];
            x=f[rt];
            pushup(f[rt]);
        }
        rt=f[rt];
    }
    a=x;
    b=y;
}
void split2(int rt,int &x,int &y,int k)
{
    if(!rt)
    {
        x=y=0;
        return ;
    }
    if(size[ls[rt]]>=k)
    {
        y=rt;
        split2(ls[rt],x,ls[y],k);
        f[ls[y]]=y;
        pushup(rt);
    }
    else
    {
        x=rt;
        split2(rs[rt],rs[x],y,k-size[ls[rt]]-1);
        f[rs[x]]=x;
        pushup(rt);
    }
}
int query(int rt,int k)
{
    if(size[ls[rt]]>=k)
    {
        return query(ls[rt],k);
    }
    else if(size[ls[rt]]+1==k)
    {
        return rt;
    }
    else
    {
        return query(rs[rt],k-size[ls[rt]]-1);
    }
}
int main()
{
    srand(12378);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        s[x]=build(x);
        root=merge(root,s[x]);
    }
    while(m--)
    {
        scanf("%s",ch);
        if(ch[0]==‘I‘)
        {
            scanf("%d%d",&x,&y);
            if(y==0)
            {
                continue;
            }
            x=s[x];
            split1(x,a,b);
            int num=size[a];
            root=merge(merge(a,x),b);
            if(y==-1)
            {
                split2(root,a,b,num-1);
                split2(b,b,c,1);
                split2(c,c,d,1);
                root=merge(merge(a,c),merge(b,d));
            }
            else
            {
                split2(root,a,b,num);
                split2(b,b,c,1);
                split2(c,c,d,1);
                root=merge(merge(a,c),merge(b,d));
            }
        }
        else if(ch[0]==‘T‘)
        {
            scanf("%d",&x);
            x=s[x];
            split1(x,a,b);
            root=merge(x,merge(a,b));
        }
        else if(ch[0]==‘B‘)
        {
            scanf("%d",&x);
            x=s[x];
            split1(x,a,b);
            root=merge(merge(a,b),x);
        }
        else if(ch[0]==‘A‘)
        {
            scanf("%d",&x);
            x=s[x];
            split1(x,a,b);
            printf("%d\n",size[a]);
            root=merge(merge(a,x),b);
        }
        else
        {   
            scanf("%d",&x);
            printf("%d\n",v[query(root,x)]);
        }
    }
}