#include <cstdio>
#include <stdlib.h>
#include <time.h>
#define INF 2000000000
using namespace std;
struct treap{
int key;
int pri;
int revers;
int nodes;
treap *st , *dr;
treap (int key,int pri,treap *st,treap *dr,int revers,int nodes){
this->key=key;
this->pri=pri;
this->st=st;
this->dr=dr;
this->revers = revers;
this->nodes = nodes;
}
};
treap *r , *nil,*rl,*rr,*ruseless,*rmid;
void update (treap *&n){ /// update valorilor din n
n->nodes = n->st->nodes + 1 + n->dr->nodes;
}
void update_reverse (treap *&n){
if (n->revers){
n->st->revers = 1 - n->st->revers;
n->dr->revers = 1 - n->dr->revers;
n->revers = 0;
treap *aux = n->st;
n->st = n->dr;
n->dr = aux;
}
}
void left (treap *&n){
treap *y = n->st;
n->st = y->dr;
y->dr=n;
n=y;
update (n->dr);
update (n);
}
void right (treap *&n){
treap *y = n->dr;
n->dr = y->st;
y->st=n;
n=y;
update (n->st);
update (n);
}
void balance (treap*&n){
if (n->pri < n->st->pri) /// rotire stanga
left (n);
else if (n->pri < n->dr->pri) /// rotire dreapta
right(n);
}
void inser (treap *&n , int val , int poz , int pri){
//if (poz == 3)
// printf ("%d ",pri);
if (n == nil){
n = new treap(val,pri,nil,nil,0,1);
}
else {
update_reverse(n);
if (n->st->nodes + 1 < poz) /// e in dreapta
inser (n->dr,val,poz - 1 - n->st->nodes,pri);
else
inser(n->st,val,poz,pri);
balance(n);
update(n);
}
}
void delet (treap *&n , int key){
if (n ->st == nil && n->dr == nil){
if (n->key == key){
delete n;
n = nil;
}
}
else {
update_reverse(n);
if (n->st->pri > n->dr->pri){
update_reverse(n->st);
left(n);
delet (n->dr,key);
}
else {
update_reverse(n->dr);
right(n);
delet(n->st , key);
}
}
if (n!=nil)
update(n);
}
int cauta (treap *&r , int poz){
update_reverse(r);
//update(r);
if (r->st->nodes + 1 == poz){
return r->key;
}
else{
if (r->st->nodes + 1 < poz)
return cauta (r->dr , poz - 1 - r->st->nodes);
return cauta (r->st , poz);
}
}
void split (treap *&r , treap *&rs , treap *&rd , int key){
inser(r,INF,key,INF);
rs = r->st;
rd = r->dr;
delete r;
}
void join (treap *&r , treap*&rs , treap*&rd){
r = new treap ( -1 , INF , rs , rd , 0 , rs->nodes + rd->nodes );
delet (r , -1);
}
int main()
{
FILE *fin = fopen ("secv8.in","r");
FILE *fout = fopen ("secv8.out","w");
int q,ok,x,y;
char c;
//srand(time(0));
r = nil = new treap (0,0,NULL,NULL,0,0);
int elem = 0;
fscanf (fin,"%d%d\n",&q,&ok);
for (;q;q--){
c=fgetc(fin);
if (c == 'I'){
fscanf (fin,"%d%d\n",&y,&x);
elem++;
/// insert elem x poz y
inser (r,x,y,rand()%INF+1);
}
else if (c == 'A'){
fscanf (fin,"%d\n",&x);
/// access elem poz x
fprintf (fout,"%d\n",cauta (r,x));
//for (int i=1;i<=elem;i++)
// printf ("%d ",cauta (r,i));
}
else if (c == 'R'){
fscanf (fin,"%d%d\n",&x,&y);
/// reverse x .. y
split (r , rmid , rr , y+1);
split (rmid , rl , ruseless , x);
ruseless->revers = 1;
join (rmid,rl,ruseless);
join (r,rmid,rr);
}
else{
fscanf (fin,"%d%d\n",&x,&y);
/// delete x .. y
split (r , rmid , rr , y+1);
split (rmid , rl , ruseless , x);
join (r,rl,rr);
elem = elem - (y - x + 1);
//for (int i=1;i<=elem;i++)
// printf ("%d ",cauta (r,i));
}
}
for (int i = 1 ; i <= elem ; i ++)
fprintf (fout,"%d ",cauta(r,i));
return 0;
}