RT,subtask 0全MLE,大数据的时候不输出
应该是一个奇怪的问题
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int q;
struct BST {
int lc, rc;
int val, cnt;
int sum;
//cnt表示val的出现次数
//sum表示子树中cnt的和
BST() {
lc = rc = val = cnt = sum = 0;
}
} T[N];
int root = -1;
int tt = 0;
void pushup(int rt) {
T[rt].sum = T[rt].cnt + T[T[rt].lc].sum + T[T[rt].rc].sum;
}
void add(int rt, int x) {
if (x == T[rt].val) {
T[rt].cnt++;
T[rt].sum++;
} else if (x < T[rt].val) {
if (T[rt].lc == 0) {
T[rt].lc = ++tt;
T[tt].val = x;
T[tt].cnt = T[tt].sum = 1;
} else {
add(T[rt].lc, x);
}
} else {
if (T[rt].rc == 0) {
T[rt].rc = ++tt;
T[tt].val = x;
T[tt].cnt = T[tt].sum = 1;
} else {
add(T[rt].rc, x);
}
}
pushup(rt);
}
int rk(int rt, int x) {
if (rt == 0) return 1;
//查询数x的排名
if (T[rt].val == x) {
return T[T[rt].lc].sum + 1;
}
if (T[rt].val > x) {
//left
return rk(T[rt].lc, x);
}
return rk(T[rt].rc, x) + T[T[rt].lc].sum + T[rt].cnt;
}
int num(int rt, int x) {
//cerr<<"rt:"<<rt<<endl;
if (x <= T[T[rt].lc].sum) {
return num(T[rt].lc, x);
}
if (x > T[T[rt].lc].sum && x <= T[T[rt].lc].sum + T[rt].cnt) {
return T[rt].val;
}
return num(T[rt].rc, x - (T[T[rt].lc].sum + T[rt].cnt));
}
int tmp;
int pre(int rt, int x) {
if (x <= T[rt].val) {
if (T[rt].lc == 0) return -2147483647;
return pre(T[rt].lc, x);
}
tmp = pre(T[rt].rc, x);
if (tmp == -2147483647) return T[rt].val;
return tmp;
}
int nxt(int rt, int x) {
if (T[rt].val <= x) {
if (T[rt].rc == 0) return 2147483647;
else return nxt(T[rt].rc, x);
}
tmp = nxt(T[rt].lc, x);
if (tmp == 2147483647) return T[rt].val;
return tmp;
}
int main() {
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
//cout << sizeof(long long) << endl;
//cout<<1;
scanf("%d", &q);
int op, x;
//cout<<1;
while (q--) {
scanf("%d%d", &op, &x);
//cout<<21;
if (op == 1) {
printf("%d\n", rk(root, x));
} else if (op == 2) {
printf("%d\n", num(root, x));
} else if (op == 3) {
printf("%d\n", pre(root, x));
} else if (op == 4) {
printf("%d\n", nxt(root, x));
} else {
//cout << "in\n";
if (root == -1) {
root = ++tt;
T[root].sum = T[root].cnt = 1;
T[root].val = x;
} else {
//cout<<"1\n";
add(root, x);
//cout<<"1\n";
}
}
}
return 0;
}