似乎不是特别难写的样子?
然而我并不会rope
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
inline int read() {
int x=0, f=1; char ch=getchar();
while('0'>ch || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while('0'<=ch && ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
return x*f;
}
const int MAXN = 7000000;
int q, ccnt;
int now, root[50020];
char str[120];
struct Treap {
int val[MAXN+10], sz[MAXN+10], ch[MAXN+10][2], rnd[MAXN+10];
int ncnt;
void up(int x) {
sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
}
int NewNode(int x) {
int k = ++ncnt;
ch[k][0] = ch[x][0]; ch[k][1] = ch[x][1];
rnd[k] = rnd[x]; val[k] = val[x]; sz[k] = 1;
return k;
}
int merge(int x, int y) {
if(!x) return y;
if(!y) return x;
if(rnd[x] < rnd[y]) {
int k = NewNode(x);
ch[k][1] = merge(ch[x][1], y);
up(k);
return k;
}
else {
int k = NewNode(y);
ch[k][0] = merge(x, ch[y][0]);
up(k);
return k;
}
}
void split(int x, int k, int &L, int &R) {
if(sz[x] <= k) {
L = x, R = 0;
return ;
}
int tmp = sz[ch[x][0]], t = NewNode(x);
int a, b;
if(k <= tmp) {
split(ch[x][0], k, a, b);
ch[t][0] = b;
R = t;
L = a;
}
else {
split(ch[x][1], k-tmp-1, a, b);
ch[t][1] = a;
L = t;
R = b;
}
up(t);
}
int build(int l, int r, int pre) {
if(l > r) return 0;
int m = (l+r) >> 1;
int x = ++ncnt;
rnd[x] = rand()+pre;
sz[x] = 1; val[x] = str[m];
ch[x][0] = build(l, m-1, rnd[x]);
ch[x][1] = build(m+1, r, rnd[x]);
up(x);
return x;
}
void out(int x) {
if(!x) return ;
out(ch[x][0]);
putchar(val[x]); if(val[x] == 'c') ccnt++;
out(ch[x][1]);
}
void solve() {
ncnt = ccnt = now = 0;
memset(root, 0, sizeof(root));
for(int i = 1; i <= q; i++) {
int op = read();
if(op == 1) {
int p = read()-ccnt;
SF("%s", str+1);
int t = build(1, strlen(str+1), 0);
now++;
if(!p) root[now] = merge(t, root[now-1]);
else if(p == sz[root[now-1]]) root[now] = merge(root[now-1], t);
else {
int L, R;
split(root[now-1], p, L, R);
root[now] = merge(L, t);
root[now] = merge(root[now], R);
}
}
else if(op == 2) {
now++;
int p = read()-ccnt, c = read()-ccnt;
int L, R, X, Y;
split(root[now-1], p-1, L, R);
split(R, c, X, Y);
root[now] = merge(L, Y);
}
else {
int v = read()-ccnt, p = read()-ccnt, c = read()-ccnt;
int L, R, X, Y;
split(root[v], p-1, L, R);
split(R, c, X, Y);
out(X);
puts("");
}
}
}
} tp;
int main() {
while(~SF("%d", &q)) {
tp.solve();
}
}