RT,本地测样例一直RE,求大佬查错
#include<bits/stdc++.h>
using namespace std;
int n;
int val[100005], rd[100005];
int size[100005], son[100005][2];
int sum, f, x, y, z;
int new_node(int v) {
sum++;
val[sum] = v; rd[sum] = rand(); size[v] = 1;
return sum;
}
void pushup(int k) {size[k] = size[son[k][0]] + size[son[k][1]] + 1;}
void split(int k, int v, int &x, int &y) {
if (!k) {x = y = 0; return;}
if (val[k] <= v)
x = k, split(son[k][1], v, son[k][1], y);
else
y = k, split(son[k][0], v, x, son[k][0]);
pushup(k);
}
int merge(int x, int y) {
if (!x || !y) return x + y;
if (rd[x] < rd[y]) {
son[x][1] = merge(son[x][1], y); pushup(x);
return x;
} else {
son[y][0] = merge(x, son[y][0]); pushup(y);
return y;
}
}
void insert(int v) {
split(f, v, x, y);
f = merge(merge(x, new_node(v)), y);
}
void del(int v) {
split(f, v, x, z);
split(x, v - 1, x, y);
y = merge(son[y][0], son[y][1]);
f = merge(merge(x, y), z);
}
int rank(int v) {
split(f, v - 1, x, y);
int ans = size[x] + 1;
f = merge(x, y);
return ans;
}
int kth(int k, int x) {
if (!k) return 0;
if (size[son[k][0]] >= x) return kth(son[k][0], x);
if (size[son[k][0]] + 1 < x) return kth(son[k][1], x - size[son[k][0]] - 1);
else return val[k];
}
int pre(int v) {
split(f, v - 1, x, y);
int ans = kth(x, size[x]);
f = merge(x, y);
return ans;
}
int nxt(int v) {
split(f, v, x, y);
int ans = kth(y, 1);
f = merge(x, y);
return ans;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
int p, x; cin >> p >> x;
switch (p) {
case 1: insert(x); break;
case 2: del(x); break;
case 3: cout << rank(x) << endl; break;
case 4: cout << kth(f, x) << endl; break;
case 5: cout << pre(x) << endl; break;
default: cout << nxt(x) << endl; break;
}
}
return 0;
}