#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define INF 2000000000
using namespace std;
ifstream fin ("secv8.in");
ofstream fout("secv8.out");
struct treap {
int priority;
int value;
int nodes;
int reversed;
treap *left, *right;
treap (int priority, int value, int nodes, int reversed, treap *left, treap *right) {
this->priority = priority;
this->value = value;
this->nodes = nodes;
this->reversed = reversed;
this->left = left;
this->right = right;
}
};
treap *r, *nil, *rL, *rR, *raux;
int n, position, value, st, dr;
char op;
void updateReversed(treap *r) {
if (r->reversed == 1 && r != nil) {
r->left->reversed = 1 - r->left->reversed;
r->right->reversed = 1 - r->right->reversed;
treap *aux = r->left;
r->left = r->right;
r->right = aux;
r->reversed = 0;
}
}
void updateNodes(treap *r) {
if (r == nil)
r->nodes = 0;
else
r->nodes = 1 + r->left->nodes + r->right->nodes;
}
int Rand()
{
return 1 + (((rand()%32768)<<15) + rand()%32768 + 1 );
}
void show(treap *r, int level) {
if (r != nil) {
updateReversed(r);
show(r->right, level+1);
for (int i=1;i<=level;i++)
cout<<" ";
cout<<r->value<<" "<<r->nodes<<"\n";
show(r->left, level+1);
}
}
void rotateRight(treap * &r) {
treap *f = r->left;
r->left = f->right;
f->right = r;
r = f;
}
void rotateLeft(treap * &r) {
treap *f = r->right;
r->right = f->left;
f->left = r;
r = f;
}
void ballance(treap * &r) {
if (r->priority < r->left->priority) {
rotateRight(r);
updateNodes(r->right);
updateNodes(r);
}
else
if (r->priority < r->right->priority) {
rotateLeft(r);
updateNodes(r->left);
updateNodes(r);
}
}
void insertNode(treap * &r, int position, int priority, int value, int nodes, int reversed) {
if (r == nil) {
r = new treap(priority, value, 1, 0, nil, nil);
} else {
updateReversed(r);
if (r->left->nodes >= position-1)
insertNode(r->left, position, priority, value, nodes, reversed);
else
insertNode(r->right, position - r->left->nodes - 1, priority, value, nodes, reversed);
ballance(r);
updateNodes(r);
}
}
treap *access(treap *r, int position) {
updateReversed(r);
updateNodes(r);
if (r->left->nodes == position - 1)
return r;
else
if (r->left->nodes > position-1)
return access(r->left, position);
else
return access(r->right, position - r->left->nodes - 1);
}
void eraseNode(treap * &r, int value) {
if (r->left == nil && r->right == nil) {
if (r->value == value) {
delete r;
r = nil;
}
} else {
updateReversed(r);
if (r->left->priority > r->right->priority) {
updateReversed(r->left);
rotateRight(r);
eraseNode(r->right, value);
} else {
updateReversed(r->right);
rotateLeft(r);
//updateReversed(r);
eraseNode(r->left, value);
}
updateNodes(r);
}
}
void split(treap *r, int position, treap * &rL, treap * &rR) {
insertNode(r, position, INF, INF, 0, 0);
rL = r->left;
rR = r->right;
delete r;
}
void join(treap * &r, treap *rL, treap *rR) {
r = new treap(-1, INF, rL->nodes + rR->nodes, 0, rL, rR);
eraseNode(r, INF);
}
void dfs(treap *r) {
if (r != nil) {
updateReversed(r);
updateNodes(r);
dfs(r->left);
fout<<r->value<<" ";
dfs(r->right);
}
}
void dfs1(treap *r) {
if (r != nil) {
dfs1(r->left);
cout<<r->value<<"-"<<r->nodes<<"\n";
dfs1(r->right);
}
}
int main () {
srand(time(0));
//void insertNode(treap * &r, int position, int priority, int value, int nodes, int reversed) {
r = nil = new treap(0, 0, 0, 0, NULL, NULL);
int k;
fin>>n>>k;
for (;n--;) {
fin>>op;
if (op == 'I') {
fin>>position>>value;
insertNode(r, position, Rand(), value, 0, 0);
//show(r, 0);
//cout<<"\n";
continue;
}
if (op == 'A') {
fin>>position;
treap *aux = access(r, position);
fout<<aux->value<<"\n";
//show(r, 0);
//cout<<"\n";
continue;
}
if (op == 'R') {
fin>>st>>dr;
split(r, dr+1, raux, rR);
split(raux, st, rL, r);
r->reversed = 1;
join(raux, rL, r);
join(r, raux, rR);
//show(r, 0);
//cout<<"\n";
continue;
}
if (op == 'D') {
fin>>st>>dr;
split(r, dr+1, raux, rR);
split(raux, st, rL, r);
join(r, rL, rR);
//show(r, 0);
//cout<<"\n";
continue;
}
}
dfs(r);
//show(r, 0);
return 0;
}