玄关
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
using it = list< vector< char > >::iterator;
ull blen = 2000;
int t;
list< vector< char > > l;
vector< char > str;
auto find(ull &pos) -> it {
it x = l.begin();
while (x != l.end() && x->size() < pos) {
pos -= x->size();
x++;
}
return x;
}
auto nxt(it x) -> it {
return ++x;
}
void split(it x, ull pos) {
if (pos == x->size()) {
return;
}
l.insert(nxt(x),
vector< char >(x->begin() + pos, x->end()));
x->erase(x->begin() + pos, x->end());
}
void merge(it x) {
x->insert(x->end(), nxt(x)->begin(), nxt(x)->end());
l.erase(nxt(x));
}
void upd() {
for (it x = l.begin(); x != l.end(); x++) {
while (x->size() > blen * 2) {
split(x, blen);
}
while (nxt(x) != l.end() &&
x->size() + nxt(x)->size() < blen) {
merge(x);
}
while (nxt(x) != l.end() && nxt(x)->empty()) {
l.erase(nxt(x));
}
}
}
void out() {
for (it x = l.begin(); x != l.end(); x++) {
for (char i : *x) {
cout << i;
}
}
}
void ins(ull pos, const vector< char > &str) {
it x = find(pos);
if (!l.empty()) {
split(x, pos);
}
l.insert(nxt(x), str);
upd();
}
void del(ull left, ull right) {
it xl = find(left);
split(xl, left);
it xr = find(right);
split(xr, right);
xr++;
for (; nxt(xl) != xr;) {
l.erase(nxt(xl));
}
upd();
}
void get(ull left, ull right) {
it xl = find(left);
it xr = find(right);
for (it x = xl;; x++) {
ull a = x == xl ? left : 0;
ull b = x == xr ? right : x->size();
for (ull i = a; i < b; i++) {
putchar(x->at(i));
}
if (x == xr) {
break;
}
}
puts("");
}
char opt[11];
ull len, pos;
auto main() -> int {
freopen("P4008_1.in", "r", stdin);
freopen("1.ttt", "w", stdout);
cin >> t;
while (t-- != 0) {
cin >> opt;
if (opt[0] == 'M') {
cin >> pos;
}
if (opt[0] == 'I') {
cin >> len;
str.resize(len);
for (int i = 0; i < len; i++) {
str[i] = static_cast< char >(getchar());
while (str[i] < 32 || str[i] > 126) {
str[i] = static_cast< char >(getchar());
}
}
ins(pos, str);
}
if (opt[0] == 'D') {
cin >> len;
del(pos, pos + len);
}
if (opt[0] == 'G') {
cin >> len;
get(pos, pos + len);
}
if (opt[0] == 'P') {
pos--;
}
if (opt[0] == 'N') {
pos++;
}
// cout << endl << pos << "out:";
// out();
// cout << endl;
}
return 0;
}