86pts,前两个点蜜汁TLE。
码风不是特别好但也没有太差啦
#include <bits/stdc++.h>
using namespace std;
#define il inline
const int N = 1000010;
int rt, tot, fa[N], ch[N][2], val[N], cnt[N], sz[N];
il void clear(int x) { fa[x] = ch[x][0] = ch[x][1] = cnt[x] = val[x] = sz[x] = 0; }
il bool get(int x) { return ch[fa[x]][1] == x; }
il void pushup(int x)
{
if (x)
{
sz[x] = cnt[x];
if (ch[x][0]) sz[x] += sz[ch[x][0]];
if (ch[x][1]) sz[x] += sz[ch[x][1]];
}
}
il void rotate(int x)
{
int y = fa[x], z = fa[y], k = get(x);
ch[y][k] = ch[x][k^1], fa[ch[x][k^1]] = y, ch[x][k^1] = y, fa[y] = x, fa[x] = z;
if (z) ch[z][ch[z][1] == y] = x;
pushup(y), pushup(x);
}
il void splay(int x, int goal = 0)
{
while (fa[x] != goal)
{
int y = fa[x], z = fa[y];
if (z != goal) rotate(get(x) == get(y) ? y : x);
rotate(x);
} if (!goal) rt = x;
}
il void find(int x)
{
int u = rt;
if (!u) return ;
while (ch[u][x > val[u]] && x != val[u]) u = ch[u][x > val[u]];
splay(u, 0);
}
il void insert(int x) //插入
{
int u = rt, f = 0;
while (u && val[u] != x) f = u, u = ch[u][x > val[u]];
if (u) cnt[u]++, pushup(u), pushup(f);
else
{
u = ++tot, val[u] = x, sz[u] = cnt[u] = 1, fa[u] = f, ch[u][0] = ch[u][1] = 0;
if (f) ch[f][x > val[f]] = u, pushup(f);
else rt = u;
} splay(u, 0);
}
il int query_rank(int x)
{
int u = rt, ret = 0;
while (1)
if (x < val[u]) u = ch[u][0];
else
{
ret += sz[ch[u][0]];
if (x == val[u]) return splay(u), ret + 1;
ret += cnt[u], u = ch[u][1];
}
}
//il int query_rank(int x) { return find(x), sz[ch[rt][0]] + 1; }
il int query_kth(int k)
{
int u = rt;
while (1)
{
if (ch[u][0] && k <= sz[ch[u][0]]) u = ch[u][0];
else
{
int tmp = sz[ch[u][0]] + cnt[u];
if (k <= tmp) return val[u];
k -= tmp, u = ch[u][1];
}
}
}
il int pre(int x) //前驱
{
find(x); if (val[rt] < x) return rt;
int u = ch[rt][0]; while (ch[u][1]) u = ch[u][1];
return u;
}
il int succ(int x) //后继
{
find(x); if (val[rt] > x) return rt;
int u = ch[rt][1]; while (ch[u][0]) u = ch[u][0];
return u;
}
il void del(int x) //删除
{
find(x);
if (cnt[rt] > 1) return cnt[rt]--, pushup(rt), void();
if (!ch[rt][0] && !ch[rt][1]) return rt = 0, void();
if (!ch[rt][0] || !ch[rt][1]) return rt = ch[rt][0] ? ch[rt][0] : ch[rt][1], fa[rt] = 0, void();
int ort = rt, lbig = pre(x);
splay(lbig), ch[rt][1] = ch[ort][1], fa[ch[ort][1]] = rt, pushup(rt);
}
//il void del(int x)
//{
// int p = pre(x), s = succ(x); splay(p, 0), splay(s, p);
// int del = ch[s][0];
// if (cnt[del] > 1) cnt[del]--, splay(del, 0);
// else ch[s][0] = 0, pushup(s), pushup(p);
//}
int main()
{
int n; scanf("%d", &n);
while (n--)
{
int op, x; scanf("%d%d", &op, &x);
if (op == 1) insert(x);
else if (op == 2) del(x);
else if (op == 3) printf("%d\n", query_rank(x));
else if (op == 4) printf("%d\n", query_kth(x));
else if (op == 5) printf("%d\n", val[pre(x)]);
else printf("%d\n", val[succ(x)]);
}
return 0;
}