0分代码
/*********************************************************************
程序名:
版权: 归作者所有
作者: 洛谷:ca0vnv
日期: 2024-05-26 16:04
说明: 这里应该没有村里人了吧
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, inf = 0x7fffffff;
int idx, n, opt, xx;
struct node {
int size, val, cnt, lc, rc;
} tree[N];
void add(int pos, int val) {
tree[pos].size++;
if (tree[pos].val == val) {
tree[pos].cnt++;
return ;
}
if (tree[pos].val < val) {
if (tree[pos].lc) {
add(tree[pos].lc, val);
} else {
tree[++idx].val = val;
tree[idx].size = tree[idx].cnt = 1;
tree[pos].lc = idx;
}
} else {
if (tree[pos].rc) {
add(tree[pos].rc, val);
} else {
tree[++idx].val = val;
tree[idx].size = tree[idx].cnt = 1;
tree[pos].rc = idx;
}
}
}
int query_pre(int pos, int val, int ans) {
if (tree[pos].val >= val) {
if (tree[pos].lc == 0) {
return ans;
} else {
return query_pre(tree[pos].lc, val, ans);
}
} else {
if (tree[pos].rc == 0) {
return tree[pos].val < val ? tree[pos].val : ans;
}
if (!tree[pos].cnt) {
return query_pre(tree[pos].rc, val, tree[pos].val);
}
return query_pre(tree[pos].rc, val, ans);
}
}
int query_next(int pos, int val, int ans) {
if (tree[pos].val <= val) {
if (tree[pos].rc == 0) {
return ans;
} else {
return query_next(tree[pos].rc, val, ans);
}
} else {
if (tree[pos].lc == 0) {
return tree[pos].val > val ? tree[pos].val : ans;
}
if (!tree[pos].cnt) {
return query_next(tree[pos].lc, val, tree[pos].val);
}
return query_next(tree[pos].lc, val, ans);
}
}
int query_rank(int pos, int val) {
if (pos == 0) {
return 0;
}
if (val == tree[pos].val) {
return tree[tree[pos].lc].size;
}
if (tree[pos].val > val) {
return query_rank(tree[pos].lc, val);
}
return query_rank(tree[pos].rc, val) + tree[tree[pos].lc].size + tree[pos].cnt;
}
int query_val(int pos, int rk) {
if (pos == 0) {
return inf;
}
if (tree[tree[pos].lc].size >= rk) {
} if (tree[tree[pos].lc].size + tree[pos].cnt >= rk) {
return query_val(tree[pos].lc, rk);
return tree[pos].val;
}
return query_val(tree[pos].rc, rk - tree[tree[pos].lc].size - tree[pos].cnt);
}
signed main() {
cin >> n;
while (n--) {
cin >> opt >> xx;
if (opt == 1) {
cout << query_rank(1, xx) + 1<<endl;
} else if (opt == 2) {
cout << query_val(1, xx)<<endl;
} else if (opt == 3) {
cout << query_pre(1, xx, -inf)<<endl;
} else if (opt == 4) {
cout << query_next(1, xx, inf)<<endl;
} else {
if (idx == 0) {
idx++;
tree[idx].cnt = tree[idx].size = 1;
tree[idx].val = xx;
} else {
add(1, xx);
}
}
}
return 0;
}