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
| struct Treap { int cnt, root[MAXN], pre, now, nxt; struct Node { int val, key, l, r, siz; } s[MAXN * MAXLOG]; int newnode(int val) { s[++cnt].val = val, s[cnt].key = rand(), s[cnt].siz = 1; return cnt; } 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) { x = y = 0; return; } if (s[p].val <= val) s[++cnt] = s[p], x = cnt, split(s[x].r, val, s[x].r, y), push_up(x); else s[++cnt] = s[p], y = cnt, split(s[y].l, val, x, s[y].l), push_up(y); } int merge(int x, int y) { if (!x || !y) return x + y; int p = ++cnt; if (s[x].key > s[y].key) s[p] = s[x], s[p].r = merge(s[p].r, y); else s[p] = s[y], s[p].l = merge(x, s[p].l); push_up(p); return p; } void insert(int& p, int val) { split(p, val, pre, nxt), p = merge(pre, merge(newnode(val), nxt)); } void remove(int& p, int val) { split(p, val, pre, nxt), split(pre, val - 1, pre, now); now = merge(s[now].l, s[now].r), p = merge(merge(pre, now), nxt); } int queryrnk(int p, int val) { split(p, val - 1, pre, nxt); int res = s[pre].siz + 1 - 1; p = merge(pre, nxt); 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 p, int val) { split(p, val - 1, pre, nxt); int res = querykth(pre, s[pre].siz); p = merge(pre, nxt); return res; } int querynxt(int p, int val) { split(p, val, pre, nxt); int res = querykth(nxt, 1); p = merge(pre, nxt); return res; } } treap;
|