#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct treap{
int priority;
int size;
int value;
bool reversed;
treap *left;
treap *right;
treap(int _value=0){
reversed=false;
priority=rand();
size=1;
value=_value;
left=right=NULL;
}
};
treap* root;
treap* nil;
int get_size(treap *node){
if(node==NULL)
return 0;
return node->size;
}
void update(treap *node){
if(node!=NULL)
node->size=1+get_size(node->left)+get_size(node->right);
}
void reverse_node(treap *node){
if(node==NULL)
return;
node->reversed^=1;
}
void propagate(treap *&node){
treap* answer;
if(node==NULL||node->reversed==false)
return;
node->reversed=false;
swap(node->left,node->right);
reverse_node(node->left);
reverse_node(node->right);
}
void split(treap *node,int size,treap *&left,treap *&right){
propagate(node);
if(node==NULL){
left=right=NULL;
return;
}
if(get_size(node->left)<size){
split(node->right,size-get_size(node->left)-1,node->right,right);
left=node;
}
else{
split(node->left,size,left,node->left);
right=node;
}
update(node);
}
void join(treap *&answer,treap *first,treap *second){
if(first==NULL){
answer=second;
return;
}
if(second==NULL){
answer=first;
return;
}
propagate(first);
propagate(second);
if(second->priority<first->priority){
join(first->right,first->right,second);
answer=first;
}
else{
join(second->left,first,second->left);
answer=second;
}
propagate(answer);
update(answer);
}
void insert(treap *&node,treap *add,int index){
propagate(node);
if(node==NULL){
node=add;
return;
}
if(node->priority<add->priority){
split(node,index,add->left,add->right);
node=add;
}
else
if(get_size(node->left)<index)
insert(node->right,add,index-get_size(node->left)-1);
else
insert(node->left,add,index);
update(node);
}
void erase(int first,int second){
treap *treap1=new treap,*treap2=new treap,*treap3=new treap,*temp=new treap;
split(root,first-1,treap1,temp);
split(temp,second-first+1,treap2,treap3);
join(root,treap1,treap3);
}
int find(treap* node,int index){
propagate(node);
if(node==NULL)
return -1;
if(index==get_size(node->left)+1)
return node->value;
if(index<get_size(node->left)+1)
return find(node->left,index);
else
return find(node->right,index-get_size(node->left)-1);
}
void reverse(int first,int second){
treap *treap1=new treap,*treap2=new treap,*treap3=new treap,*temp=new treap;
split(root,first-1,treap1,temp);
split(temp,second-first+1,treap2,treap3);
reverse_node(treap2);
join(temp,treap1,treap2);
join(root,temp,treap3);
}
void dump(treap* node){
propagate(node);
if(node!=NULL){
dump(node->left);
printf("%d ",node->value);
dump(node->right);
}
}
int main(){
freopen("secv8.in","r",stdin);
freopen("secv8.out","w",stdout);
int operations,is_reversed,i,index,value,first,second;
srand(time(0));
nil=new treap;
root=NULL;
char operation;
scanf("%d%d\n",&operations,&is_reversed);
for(i=1;i<=operations;i++){
scanf("%c",&operation);
if(operation=='I'){
scanf("%d%d\n",&index,&value);
insert(root,new treap(value),index-1);
}
if(operation=='A'){
scanf("%d\n",&index);
printf("%d\n",find(root,index));
}
if(operation=='R'){
scanf("%d%d\n",&first,&second);
reverse(first,second);
}
if(operation=='D'){
scanf("%d%d\n",&first,&second);
erase(first,second);
}
}
dump(root);
return 0;
}