#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef int ll;
using namespace std;
const ll MAXN = 2 * 1024 * 1024, inf = 0x3f3f3f3f;
struct TreapNode {
char val;
ll l, r, sz, pri;
TreapNode() {
l = r = sz = 0;
val = '\0';
pri = ~inf;
}
TreapNode(char v) {
l = r = 0;
sz = 1;
val = '\0';
pri = rand();
val = v;
}
};
struct Treap {
ll size = 0, rt = 0;
TreapNode val[MAXN + 5];
void upd(ll x) {
if (x == 0) {
val[x].sz = 0;
} else {
val[x].sz = 1 + val[val[x].l].sz + val[val[x].r].sz;
}
}
void sptrk(ll& x, ll rk, ll& L, ll& R) {
if (x == 0) {
L = R = 0;
return;
}
if (val[val[x].l].sz + 1 <= rk) {
L = x;
sptrk(val[x].r, rk - (val[val[x].l].sz + 1), val[x].r, R);
} else {
R = x;
sptrk(val[x].l, rk, L, val[x].l);
}
upd(x);
}
ll mrg(ll L, ll R) {
if (L == 0 || R == 0) {
return L + R;
}
if (val[L].pri >= val[R].pri) {
val[L].r = mrg(val[L].r, R);
upd(L);
return L;
} else {
val[R].l = mrg(L, val[R].l);
upd(R);
return R;
}
}
void insert(ll p, string& v) {
ll L = 0, R = 0;
sptrk(rt, p, L, R);
for (char c : v) {
val[++size] = TreapNode(c);
L = mrg(L, size);
}
rt = mrg(L, R);
}
void del(ll p, ll len) {
ll L = 0, M = 0, R = 0;
sptrk(rt, p, L, R);
sptrk(R, len, M, R);
rt = mrg(L, R);
}
void mid(ll x) {
if (x == 0) {
return;
}
mid(val[x].l);
cout << val[x].val;
mid(val[x].r);
}
void get(ll p, ll len) {
ll L = 0, M = 0, R = 0;
sptrk(rt, p, L, R);
sptrk(R, len, M, R);
mid(M);
rt = mrg(L, mrg(M, R));
}
} te;
ll T, pnt = 0;
int main() {
te = Treap();
cin >> T;
while (T--) {
string o;
ll k;
cin >> o;
if (o[0] == 'M') {
cin >> pnt;
} else if (o[0] == 'I') {
cin >> k;
string s = string();
for (ll i = 0; i < k; i++) {
char c;
do {
scanf("%c", &c);
} while (c < 32 || c > 126);
s += c;
}
te.insert(pnt, s);
} else if (o[0] == 'D') {
cin >> k;
te.del(pnt, k);
} else if (o[0] == 'G') {
cin >> k;
te.get(pnt, k);
cout << endl;
} else if (o[0] == 'P') {
pnt--;
} else if (o[0] == 'N') {
pnt++;
}
}
return 0;
}