#include <cstdio>
#include <cstring>
#include <random>
FILE* in=fopen("secv8.in","r");
FILE* out=fopen("secv8.out","w");
///parsare------------------------------------------------
const int SBUF=4096;
char BUF[SBUF];
int pbuf=SBUF;
char BUFO[SBUF];
int pbufo=0;
void add_char(char x)
{
BUFO[pbufo++]=x;
if(pbufo==SBUF)
{
fwrite(BUFO,SBUF,1,out);
memset(BUFO,0,sizeof BUFO);
pbufo=0;
}
}
void back(long long x)
{
if(x==0)
return;
back(x/10);
add_char(x%10+'0');
}
void add_block(long long x)
{
if(x<0)
{
add_char('-');
x=-x;
}
back(x);
if(x==0)
add_char('0');
add_char(' ');
}
void jibra()
{
fprintf(out,"%s",BUFO);
}
bool digit[200];
void jibril()
{
for(int i='0'; i<='9'; i++)
digit[i]=1;
digit['-']=1;
}
char get_char()
{
if(pbuf==SBUF)
{
pbuf=0;
fread(BUF,SBUF,1,in);
}
return BUF[pbuf++];
}
long long get_int()
{
char x;
x=get_char();
long long rez=0;
while(!digit[x])
x=get_char();
long long b=1;
if(x=='-')
{
b=-1;
x=get_char();
}
while(digit[x])
{
rez=rez*10+x-'0';
x=get_char();
}
return rez*b;
}
///parsare-----------------------------------------------
int max(const int &a, const int &b)
{
return a>b?a:b;
}
int min(const int &a, const int &b)
{
return a<b?a:b;
}
struct treap
{
int nrel;
bool inv;
int my;
int prio;
treap *st,*dr;
treap(const int &act, const int &pr)
{
prio=pr;
nrel=1;
my=act;
inv=0;
st=NULL;
dr=NULL;
}
} *rad;
int numar(treap *act)
{
if(act==NULL)
return 0;
return act->nrel;
}
void rezolv(treap *act)
{
if(act->st)
act->st->inv=!act->st->inv;
if(act->dr)
act->dr->inv=!act->dr->inv;
act->inv=0;
treap *ax=act->st;
act->st=act->dr;
act->dr=ax;
}
treap *rotate_right(treap *act)
{
treap *newrad=act->st;
if(newrad->inv==1)
rezolv(newrad);
act->st=newrad->dr;
newrad->dr=act;
act->nrel=numar(act->st)+numar(act->dr)+1;
newrad->nrel=numar(newrad->st)+numar(newrad->dr)+1;
return newrad;
}
treap *rotate_left(treap *act)
{
treap *newrad=act->dr;
if(newrad->inv==1)
rezolv(newrad);
act->dr=newrad->st;
newrad->st=act;
act->nrel=numar(act->st)+numar(act->dr)+1;
newrad->nrel=numar(newrad->st)+numar(newrad->dr)+1;
return newrad;
}
treap *insert(treap *act, int poz, int val)
{
if(act==NULL)
{
act=new treap(val, (rand()&((1<<15)-1)*(1<<15)) +(rand()&((1<<15)-1)) );
if(val==-1)
act->prio=(1<<30)+20;
return act;
}
if(act->inv==1)
{
rezolv(act);
}
int nst,ndr;
if(act->st!=NULL)
nst=act->st->nrel;
else
nst=0;
if(act->dr!=NULL)
ndr=act->dr->nrel;
else
ndr=0;
if(nst+1>=poz)
{
act->st=insert(act->st,poz,val);
act->nrel=numar(act->st)+numar(act->dr)+1;
if(act->st->prio > act->prio)
act=rotate_right(act);
}
else
{
act->dr=insert(act->dr,poz-nst-1,val);
act->nrel=numar(act->st)+numar(act->dr)+1;
if(act->dr->prio > act->prio)
act=rotate_left(act);
}
return act;
}
int ask(treap *act, int poz)
{
if(act->inv==1)
{
rezolv(act);
}
int nst,nrd;
nst=numar(act->st);
nrd=numar(act->dr);
if(poz<=nst)
return ask(act->st,poz);
if(poz==nst+1)
return act->my;
return ask(act->dr,poz-nst-1);
}
treap *del(treap *act)
{
if(act->st==NULL && act->dr==NULL)
{
delete(act);
return NULL;
}
else if(act->st==NULL)
{
act=rotate_left(act);
act->st=del(act->st);
}
else if(act->dr==NULL)
{
act=rotate_right(act);
act->dr=del(act->dr);
}
else
{
if(act->st->prio> act->dr->prio)
{
act=rotate_right(act);
act->dr=del(act->dr);
}
else
{
act=rotate_left(act);
act->st=del(act->st);
}
}
act->nrel=numar(act->st)+numar(act->dr)+1;
return act;
}
treap *sterg(treap *act, int poz)
{
if(act->inv==1)
{
rezolv(act);
}
int nst,nrd;
nst=numar(act->st);
nrd=numar(act->dr);
if(poz<=nst)
{
act->st=sterg(act->st,poz);
act->nrel--;
}
else if(poz>nst+1)
{
act->dr=sterg(act->dr,poz-nst-1);
act->nrel--;
}
if(poz==nst+1)
{
treap *fst=del(act);
act=fst;
}
act->nrel=numar(act->st)+numar(act->dr)+1;
return act;
}
void reverse(int a, int b)
{
treap *auxrad=rad,*auxrad2;
treap *rad1,*rad2,*rad3;
auxrad=insert(auxrad,b+1,-1);
rad1=auxrad->st;
rad3=auxrad->dr;
auxrad2=rad1;
auxrad2=insert(auxrad2,a, -1);
rad1=auxrad2->st;
rad2=auxrad2->dr;
rad2->inv=!rad2->inv;
auxrad2=sterg(auxrad2,a);
auxrad->st=auxrad2;
auxrad=sterg(auxrad,b+1);
rad=auxrad;
}
void delet(int a, int b)
{
treap *auxrad=rad,*auxrad2;
treap *rad1,*rad2,*rad3;
auxrad=insert(auxrad,b+1,-1);
rad1=auxrad->st;
rad3=auxrad->dr;
auxrad2=rad1;
auxrad2=insert(auxrad2,a, -1);
rad1=auxrad2->st;
rad2=auxrad2->dr;
auxrad->st=rad1;
auxrad=sterg(auxrad,a);
rad=auxrad;
}
void dfs(treap *act)
{
if(act==NULL)
return;
if(act->inv==1)
{
rezolv(act);
}
dfs(act->st);
fprintf(out,"%d ",act->my);
dfs(act->dr);
}
int main()
{
jibril();
rad=NULL;
int trash,n;
n=get_int();
trash=get_int();
char x;
int k,e;
for(int i=1; i<=n; i++)
{
x=get_char();
if(x=='I')
{
k=get_int();
e=get_int();
rad=insert(rad,k,e);
}
else if(x=='A')
{
k=get_int();
e=ask(rad,k);
fprintf(out,"%d\n",e);
}
else if(x=='R')
{
k=get_int();
e=get_int();
reverse(k,e);
}
else if(x=='D')
{
k=get_int();
e=get_int();
delet(k,e);
}
}
dfs(rad);
return 0;
}