1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include <iostream>
using namespace std;
const int MAXN = 10005; const int INF = 2147483647;
struct Node { int val; int ls, rs; int size; int cnt; } tree[MAXN];
int root = 0, node_count = 0;
void update(int u) { tree[u].size = tree[u].cnt + tree[tree[u].ls].size + tree[tree[u].rs].size;
}
void insert(int& u, int x) { if (!u) { u = ++node_count; tree[u].val = x; tree[u].ls = tree[u].rs = 0; tree[u].size = tree[u].cnt = 1; return; }
if (x > tree[u].val) insert(tree[u].rs, x); else if (x < tree[u].val) insert(tree[u].ls, x); else if (x == tree[u].val) tree[u].cnt++; update(u);
}
int get_rank(int u, int x) { if (!u) return 1; if (x == tree[u].val) return tree[tree[u].ls].size + 1; if (x < tree[u].val) return get_rank(tree[u].ls, x); return tree[tree[u].ls].size + tree[u].cnt + get_rank(tree[u].rs, x);
}
int get_val(int u, int x) { if (!u) return INF; int left_size = tree[tree[u].ls].size; if (x <= left_size) { return get_val(tree[u].ls, x); } if (x <= left_size + tree[u].cnt) { return tree[u].val; } return get_val(tree[u].rs, x - (left_size + tree[u].cnt)); }
int get_pre(int u, int x) { int ans = -INF; while (u) { if (tree[u].val < x) { ans = tree[u].val; u = tree[u].rs; } else { u = tree[u].ls; } } return ans; }
int get_next(int u, int x) { int ans = INF; while (u) { if (tree[u].val > x) { ans = tree[u].val; u = tree[u].ls; } else { u = tree[u].rs; } }
return ans; }
int main() { ios::sync_with_stdio(false); cin.tie(0);
int q; cin >> q; while (q--) { int op, x; cin >> op >> x; switch (op) { case 1: cout << get_rank(root, x) << "\n"; break; case 2: cout << get_val(root, x) << "\n"; break; case 3: cout << get_pre(root, x) << "\n"; break; case 4: cout << get_next(root, x) << "\n"; break; case 5: insert(root, x); break; } } return 0; }
|