下载了#1的数据,本地测试没问题,但是交上去#2没输出其余全TLE
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
typedef long long ll;
using namespace std;
const ll MAXN = 2 * 1024 * 1024, inf = 0x3f3f3f3f3f3f3f3fll;
ll readll() {
ll r = 0;
char c;
do {
c = getchar();
} while (c < '0' || c > '9');
while ('0' <= c && c <= '9') {
r = (r << 3) + (r << 1) + c - '0';
c = getchar();
}
return r;
}
void printll(ll x) {
ll revx = 0;
while (x) {
revx = (revx << 3) + (revx << 1) + x % 10;
x /= 10;
}
if (revx == 0) {
putchar('0');
return;
}
while (revx) {
putchar(revx % 10 + '0');
revx /= 10;
}
}
string readstr() {
string r;
char c;
do {
c = getchar();
} while (!(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')));
while (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
r += c;
c = getchar();
}
return r;
}
void printstr(string x) {
for (char c : x) {
putchar(c);
}
}
struct TreapNode {
char val;
ll l, r, cnt, sz, pri;
TreapNode() {
l = r = sz = 0;
val = '\0';
cnt = 1;
pri = rand();
}
TreapNode(char v) {
TreapNode();
val = v;
}
};
struct Treap {
ll size, rt;
TreapNode val[MAXN + 5];
Treap() {
size = 0;
rt = 0;
srand(time(0));
for (ll i = rand(); i <= rand(); i += rand()) {
rand();
}
val[0].pri = ~inf;
for (ll i = 1; i <= MAXN; i++) {
val[i].pri = rand();
}
}
void upd(ll x) {
if (x == 0) {
val[x].sz = 0;
} else {
val[x].sz = val[x].cnt + 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 + val[x].cnt <= rk) {
L = x;
sptrk(val[x].r, rk - (val[val[x].l].sz + val[x].cnt), 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, M = 0, R = 0;
sptrk(rt, p, L, R);
for (char c : v) {
val[M = ++size] = TreapNode(c);
upd(M);
L = mrg(L, M);
}
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);
}
string mid(ll x) {
if (x == 0) {
return string();
}
return mid(val[x].l) + val[x].val + mid(val[x].r);
}
string get(ll p, ll len) {
ll L = 0, M = 0, R = 0;
sptrk(rt, p, L, R);
sptrk(R, len, M, R);
string r = mid(M);
rt = mrg(L, mrg(M, R));
return r;
}
} te;
ll T, pnt = 0;
int main() {
// freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
// auto st = clock();
T = readll();
while (T--) {
string o;
ll k;
o = readstr();
if (o[0] == 'M') {
pnt = readll();
} else if (o[0] == 'I') {
k = readll();
string s;
for (ll i = 0; i < k; i++) {
char c;
do {
c = getchar();
} while (c < 32 || c > 126);
s += c;
}
te.insert(pnt, s);
} else if (o[0] == 'D') {
k = readll();
te.del(pnt, k);
} else if (o[0] == 'G') {
k = readll();
printstr(te.get(pnt, k));
putchar('\n');
} else if (o[0] == 'P') {
pnt--;
} else if (o[0] == 'N') {
pnt++;
}
}
// for (ll i = 1; i <= 3; i++) {
// putchar('l'), putchar(' '), printll(te.val[i].l), putchar(' '), putchar('r'), putchar(' '), printll(te.val[i].r), putchar(' '), putchar('v'), putchar(' '), putchar(te.val[i].val), putchar(' '), putchar('p'), putchar(' '), printll(te.val[i].pri), putchar(' '), putchar('s'), putchar(' '), printll(te.val[i].sz), putchar('\n');
// }
// auto ed = clock();
// printll((ed - st) * 1000 / CLOCKS_PER_SEC);
return 0;
}