#include <bits/stdc++.h>
#pragma GCC optimize("O3,inline")
class InParser {
private:
FILE *fin;
char *buff;
int sp;
char read_ch() {
++sp;
if (sp == 4096) {
sp = 0;
fread(buff, 1, 4096, fin);
}
return buff[sp];
}
public:
InParser(const char *nume) {
fin = fopen(nume, "r");
buff = new char[4096]();
sp = 4095;
}
InParser &operator>>(int &n) {
char c;
while (!isdigit(c = read_ch()) && c != '-')
;
int sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser &operator>>(long long &n) {
char c;
n = 0;
while (!isdigit(c = read_ch()) && c != '-')
;
long long sgn = 1;
if (c == '-') {
n = 0;
sgn = -1;
} else {
n = c - '0';
}
while (isdigit(c = read_ch())) {
n = 10 * n + c - '0';
}
n *= sgn;
return *this;
}
InParser &operator>>(char &n) {
while (n = read_ch(), (n < 'A' || 'Z' < n))
;
return *this;
}
};
class OutParser {
private:
FILE *fout;
char *buff;
int sp;
void write_ch(char ch) {
if (sp == 50000) {
fwrite(buff, 1, 50000, fout);
sp = 0;
buff[sp++] = ch;
} else {
buff[sp++] = ch;
}
}
public:
OutParser(const char *name) {
fout = fopen(name, "w");
buff = new char[50000]();
sp = 0;
}
~OutParser() {
fwrite(buff, 1, sp, fout);
fclose(fout);
}
OutParser &operator<<(int vu32) {
if (vu32 <= 9) {
write_ch(vu32 + '0');
} else {
(*this) << (vu32 / 10);
write_ch(vu32 % 10 + '0');
}
return *this;
}
OutParser &operator<<(long long vu64) {
if (vu64 <= 9) {
write_ch(vu64 + '0');
} else {
(*this) << (vu64 / 10);
write_ch(vu64 % 10 + '0');
}
return *this;
}
OutParser &operator<<(char ch) {
write_ch(ch);
return *this;
}
OutParser &operator<<(const char *ch) {
while (*ch) {
write_ch(*ch);
++ch;
}
return *this;
}
};
InParser in("secv8.in");
OutParser out("secv8.out");
struct Treap {
int l, r;
int val, prio;
int sz;
bool lazy;
} v[250005];
int cnt = -1;
int alloc_node(Treap t) {
v[++cnt] = t;
return cnt;
}
void push(int node) {
if (node == -1) {
return;
}
if (v[node].lazy) {
std::swap(v[node].l, v[node].r);
if (v[node].l != -1) {
v[v[node].l].lazy ^= 1;
}
if (v[node].r != -1) {
v[v[node].r].lazy ^= 1;
}
v[node].lazy = 0;
}
}
int merge(int a, int b) {
push(a);
push(b);
if (a == -1) {
return b;
}
if (b == -1) {
return a;
}
if (v[a].prio > v[b].prio) {
v[a].sz += v[b].sz;
v[a].r = merge(v[a].r, b);
return a;
} else {
v[b].sz += v[a].sz;
v[b].l = merge(a, v[b].l);
return b;
}
}
int mar(int node) {
if (node == -1) {
return 0;
}
return v[node].sz;
}
std::pair<int, int> split(int node, int k) {
push(node);
if (k == 0) {
return {-1, node};
}
if (k == v[node].sz) {
return {node, -1};
}
if (k <= mar(v[node].l)) {
v[node].sz -= mar(v[node].l);
std::pair<int, int> res = split(v[node].l, k);
v[node].l = res.second;
v[node].sz += mar(res.second);
return {res.first, node};
} else {
v[node].sz -= mar(v[node].r);
std::pair<int, int> res = split(v[node].r, k - mar(v[node].l) - 1);
v[node].r = res.first;
v[node].sz += mar(res.first);
return {node, res.second};
}
}
void print_trp(int node) {
if (node == -1) {
return;
}
push(node);
print_trp(v[node].l);
out << v[node].val << " ";
print_trp(v[node].r);
}
int main() {
std::mt19937 rng(
std::chrono::steady_clock::now().time_since_epoch().count());
int t, ok, k, e, i, j;
int root = -1;
char c;
in >> t >> ok;
while (t--) {
in >> c;
if (c == 'I') {
in >> k >> e;
int c = alloc_node(Treap{-1, -1, e, static_cast<int>(rng()), 1, 0});
if (root == -1) {
root = c;
continue;
}
std::pair<int, int> res = split(root, k - 1);
root = merge(merge(res.first, c), res.second);
} else if (c == 'A') {
in >> k;
std::pair<int, int> res1 = split(root, k - 1);
std::pair<int, int> res2 = split(res1.second, 1);
out << v[res2.first].val << '\n';
root = merge(res1.first, merge(res2.first, res2.second));
} else if (c == 'R') {
in >> i >> j;
std::pair<int, int> res1 = split(root, i - 1);
std::pair<int, int> res2 = split(res1.second, j - i + 1);
v[res2.first].lazy ^= 1;
root = merge(res1.first, merge(res2.first, res2.second));
} else if (c == 'D') {
in >> i >> j;
std::pair<int, int> res1 = split(root, i - 1);
std::pair<int, int> res2 = split(res1.second, j - i + 1);
root = merge(res1.first, res2.second);
} else {
exit(1);
}
}
print_trp(root);
return 0;
}