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 112 113
| #include <ctime> #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 1e5 + 5;
int n, root, tot, tmp1, tmp2, tmp3;
struct Treap { int l, r, key, val, siz; } s[MAXN];
int newnode(int val) { s[++tot].val = val, s[tot].key = rand(), s[tot].siz = 1; return tot; }
void push_up(int p) { s[p].siz = s[s[p].l].siz + s[s[p].r].siz + 1; }
void split(int p, int val, int& x, int& y) { if (p == 0) { x = y = 0; return; } if (s[p].val <= val) { x = p, split(s[p].r, val, s[p].r, y); } else { y = p, split(s[p].l, val, x, s[p].l); } push_up(p); }
int merge(int x, int y) { if (!x || !y) return x + y; if (s[x].key > s[y].key) { s[x].r = merge(s[x].r, y); push_up(x); return x; } else { s[y].l = merge(x, s[y].l); push_up(y); return y; } }
void insert(int val) { split(root, val, tmp1, tmp2); root = merge(merge(tmp1, newnode(val)), tmp2); }
void remove(int val) { split(root, val, tmp1, tmp2); split(tmp1, val - 1, tmp1, tmp3); tmp3 = merge(s[tmp3].l, s[tmp3].r); root = merge(merge(tmp1, tmp3), tmp2); }
int queryrnk(int val) { split(root, val - 1, tmp1, tmp2); int res = s[tmp1].siz + 1; root = merge(tmp1, tmp2); return res; }
int querykth(int p, int k) { while (p) { if (s[s[p].l].siz + 1 == k) { return s[p].val; } if (s[s[p].l].siz >= k) { p = s[p].l; continue; } k -= s[s[p].l].siz + 1, p = s[p].r; } }
int querypre(int val) { split(root, val - 1, tmp1, tmp2); int res = querykth(tmp1, s[tmp1].siz); root = merge(tmp1, tmp2); return res; }
int querynxt(int val) { split(root, val, tmp1, tmp2); int res = querykth(tmp2, 1); root = merge(tmp1, tmp2); return res; }
int main() { srand(time(0)); scanf("%d", &n); while (n--) { int opt, val; scanf("%d %d", &opt, &val); if (opt == 1) { insert(val); } else if (opt == 2) { remove(val); } else if (opt == 3) { printf("%d\n", queryrnk(val)); } else if (opt == 4) { printf("%d\n", querykth(root, val)); } else if (opt == 5) { printf("%d\n", querypre(val)); } else { printf("%d\n", querynxt(val)); } } return 0; }
|