#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
const ll maxn = 100010;
const ll inf = 0x7fffffff;
ll n, x, op, bnt = 0;
struct node {
ll size, cnt, l, r, w;
} tree[4 * maxn + 1];
void add(ll k, ll v) {
tree[k].size ++;
if (tree[k].w == v) {
tree[k].cnt ++;
return;
}
if (tree[k].w > v) {
if (tree[k].l != 0) {
add(tree[k].l, v);
} else {
bnt ++;
tree[bnt].size = 1;
tree[bnt].cnt = 1;
tree[k].l = bnt;
tree[bnt].w = v;
}
} else {
if (tree[k].r != 0) {
add(tree[k].r, v);
} else {
bnt ++;
tree[bnt].size = 1;
tree[bnt].cnt = 1;
tree[bnt].w = v;
tree[k].r = bnt;
}
}
}
ll getRank(ll k, ll v) {
if (k == 0) {
return 0;
}
if (tree[k].w = v) {
return tree[tree[k].l].size + 1;
}
if (tree[k].w > v) {
return getRank(tree[k].l, v);
}
return getRank(tree[k].r, v) + tree[tree[k].l].size + tree[k].cnt;
}
ll getVal(ll k, ll rank) {
if (k == 0) {
return inf;
}
if (tree[tree[k].l].size >= rank) {
return getVal(tree[k].l, rank);
}
if (tree[tree[k].l].size + tree[k].cnt >= rank) {
return tree[k].w;
}
return getVal(tree[k].r, rank - tree[tree[k].l].size - tree[k].cnt);
}
ll getPre(ll k, ll v, ll ans){
if (tree[k].w >= v) {
if (tree[k].l == 0) {
return ans;
} else {
return getPre(tree[k].l ,v ,ans);
}
} else {
if (tree[k].r == 0) {
if (tree[k].w < v) {
return tree[k].w;
} else {
return ans;
}
}
if (tree[k].cnt != 0) {
return getPre(tree[k].r, v, tree[k].w);
} else {
return getPre(tree[k].r, v, ans);
}
}
}
ll getNext(ll k, ll v, ll ans) {
if (tree[k].w <= v) {
if (tree[k].r == 0) {
return ans;
} else {
return getNext(tree[k].r, v, ans);
}
} else {
if (tree[k].l == 0) {
if (tree[k].w > v) {
return tree[k].w;
} else {
return ans;
}
}
if (tree[k].cnt != 0) {
return getNext(tree[k].l, v, tree[k].w);
} else {
return getNext(tree[k].l, v, ans);
}
}
}
int main() {
scanf("%d" ,&n);
while (n --) {
scanf("%d%d" ,&op ,&x);
if (op == 1) {
printf("%d\n", getRank(1, x) + 1);
} else if (op == 2) {
printf("%d\n", getVal(1, x));
} else if (op == 3) {
printf("%d\n", getPre(1, x, -inf));
} else if (op == 4) {
printf("%d\n", getNext(1, x, inf));
} else {
if (bnt == 0){
bnt ++;
tree[bnt].size = 1;
tree[bnt].cnt = 1;
tree[bnt].w = x;
} else {
add(1,x);
}
}
}
return 0;
}
感谢所有的回答者!!