#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
class Hash{
public:
int r1,r2;
};
class Treap{
public:
int size;
int val;
int key;
bool rev;
Treap* left;
Treap* right;
Treap(int _size=0,int _val=0,int _key=0,bool _rev=0,Treap* _left=0,Treap* _right=0){
size=_size;
val=_val;
key=_key;
rev=_rev;
left=_left;
right=_right;
}
};
Treap *nil=new Treap;
Treap *T=nil;
int q_val;
int my_rand(){
return rand()*rand()+rand();
}
Treap* same(Treap* node){
Treap* res=new Treap;
if(!node)
return NULL;
res->size=node->size;
res->val=node->val;
res->key=node->key;
res->rev=node->rev;
res->left=node->left;
res->right=node->right;
return res;
}
void update(Treap* node){
if(node==nil)
return;
if(node->rev){
node->left->rev^=1;
node->right->rev^=1;
node->rev=false;
swap(node->left,node->right);
}
node->size=node->left->size+1+node->right->size;
}
int get_size(Treap* node){
if(!node)
return 0;
return node->size;
}
pair<Treap*,Treap*>split(Treap* node,int size1){
pair<Treap*,Treap*>res;
res.first=new Treap;
res.second=new Treap;
update(node);
if(node==nil){
res.first=nil;
res.second=nil;
return res;
}
if(get_size(node->left)+1<=size1){
pair<Treap*,Treap*> split_t=split(node->right,size1-get_size(node->left)-1);
node->right=split_t.first;
split_t.first=node;
update(node);
return split_t;
}
else{
pair<Treap*,Treap*> split_t=split(node->left,size1);
node->left=split_t.second;
split_t.second=node;
update(node);
return split_t;
}
}
Treap* join(Treap* node1,Treap* node2){
if(node1==nil)
return node2;
if(node2==nil)
return node1;
update(node1);
update(node2);
if(node1->key>node2->key){
node1->right=join(node1->right,node2);
update(node1);
return node1;
}
else{
node2->left=join(node1,node2->left);
update(node2);
return node2;
}
}
Treap* insert(Treap* node,int val,int pos){
pair<Treap*,Treap*> split_t=split(node,pos);
Treap *cen=new Treap(1,val,my_rand(),false,nil,nil);
return join(split_t.first,join(cen,split_t.second));
}
Treap* erase(Treap* node,int l,int r){
pair<Treap*,Treap*>split_t1=split(node,l-1);
pair<Treap*,Treap*>split_t2=split(split_t1.second,r-l+1);
return join(split_t1.first,split_t2.second);
}
Treap* reverse(Treap* node,int l,int r){
update(node);
pair<Treap*,Treap*>split_t1=split(node,l-1);
pair<Treap*,Treap*>split_t2=split(split_t1.second,r-l+1);
split_t2.first->rev^=1;
return join(split_t1.first,join(split_t2.first,split_t2.second));
}
Treap* query(Treap* node,int pos){
update(node);
pair<Treap*,Treap*>split_t1=split(node,pos);
pair<Treap*,Treap*>split_t2=split(split_t1.second,1);
q_val=split_t2.first->val;
return join(split_t1.first,join(split_t2.first,split_t2.second));
}
void print(Treap* node){
if(node==nil)
return;
print(node->left);
printf("%d ",node->val);
print(node->right);
}
int main(){
freopen("secv8.in","r",stdin);
freopen("secv8.out","w",stdout);
int nrq,t;
scanf("%d%d\n",&nrq,&t);
while(nrq--){
char c;
scanf("%c",&c);
if(c=='I'){
int pos,val;
scanf("%d%d\n",&pos,&val);
T=insert(T,val,pos-1);
}
else if(c=='A'){
int pos;
scanf("%d\n",&pos);
T=query(T,pos-1);
printf("%d\n",q_val);
}
else if(c=='R'){
int l,r;
scanf("%d%d\n",&l,&r);
T=reverse(T,l,r);
}
else{
int l,r;
scanf("%d%d\n",&l,&r);
T=erase(T,l,r);
}
}
print(T);
return 0;
}