RT, 数据下载下来本地测试过了, 但是提交全部TLE, 0pts
#include <bits/stdc++.h>
#define maxn 8000005
using namespace std;
int sz[maxn], val[maxn], rd[maxn], ch[maxn][2], tot;
int inf = 2147483647, n, rt[maxn];
int make(int p) {
sz[++tot] = 1;
val[tot] = p;
rd[tot] = rand();
return tot;
}
int copy(int x) {
sz[++tot] = sz[x], val[tot] = val[x], rd[tot] = rd[x], ch[tot][0] = ch[x][0], ch[tot][1] = ch[x][1];
return tot;
}
void pushup(int x) {
sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
}
int merge(int x, int y) {
if(!x || !y) return x + y;
int cur;
if(rd[x] <= rd[y]) {
cur = copy(y);
ch[cur][0] = merge(x, ch[cur][0]);
}
else {
cur = copy(x);
ch[cur][1] = merge(ch[cur][1], y);
}
pushup(cur);
return cur;
}
void split(int p, int k, int &x, int &y) {
if(!p) x = y = 0;
else {
if(val[p] <= k) {
x = copy(p);
split(ch[x][1], k, ch[x][1], y);
pushup(x);
}
else {
y = copy(p);
split(ch[y][0], k, x, ch[y][0]);
pushup(y);
}
}
}
void del(int &rt, int k) {
int x = 0, y = 0, z = 0;
split(rt, k, x, z);
split(x, k - 1, x, y);
y = merge(ch[y][0], ch[y][1]);
rt = merge(merge(x, y), z);
}
int ins(int &rt, int k) {
int x = 0, y = 0, z = 0;
split(rt, k, x, y);
z = make(k);
rt = merge(merge(x, z), y);
}
int rnk(int p, int k) {
while(1) {
if(k <= sz[ch[p][0]]) p = ch[p][0];
else if(k == sz[ch[p][0]] + 1) return val[p];
else k -= (sz[ch[p][0]] + 1), p = ch[p][1];
}
}
int kth(int &rt, int k) {
int x, y;
split(rt, k - 1, x, y);
int res = sz[x] + 1;
rt = merge(x, y);
return res;
}
int pre(int &rt, int k) {
int x, y, res;
split(rt, k - 1, x, y);
if(!x) return -inf;
res = rnk(x, sz[x]);
rt = merge(x, y);
return res;
}
int suc(int &rt, int k) {
int x, y, res;
split(rt, k, x, y);
if(!y) return inf;
res = rnk(y, 1);
rt = merge(x, y);
return res;
}
int main() {
scanf("%d", &n);
for(int i = 1;i <= n;i++) {
int a, op, x;
scanf("%d%d%d", &a, &op, &x);
rt[i] = rt[a];
if(op == 1) ins(rt[i], x);
else if(op == 2) del(rt[i], x);
else if(op == 3) printf("%d\n", kth(rt[i], x));
else if(op == 4) printf("%d\n", rnk(rt[i], x));
else if(op == 5) printf("%d\n", pre(rt[i], x));
else printf("%d\n", suc(rt[i], x));
}
}