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
| struct PresidentTree { int tot, cnt, root[MAXN]; struct Node { int l, r, lch, rch; LL dat; } s[MAXN]; void init() { for (int i = 1; i <= tot; i++) s[i] = Node{0, 0, 0, 0, 0}, root[i] = 0; tot = cnt = 0; } int newnode(int val, int l, int r) { s[++tot] = Node{l, r, 0, 0, 0}; return tot; } void update(int& p, int x, LL val) { s[++tot] = s[p], p = tot, s[p].dat++; if (s[p].l == s[p].r) return; int mid = (s[p].l + s[p].r) >> 1; if (x <= mid) { if (!s[p].lch) s[p].lch = newnode(0, s[p].l, mid); update(s[p].lch, x, val); } else { if (!s[p].rch) s[p].rch = newnode(0, mid + 1, s[p].r); update(s[p].rch, x, val); } } int query(int rt1, int rt2, int k) { if (s[rt1].l == s[rt1].r) return s[rt1].l; int mid = (s[rt1].r + s[rt1].l) >> 1; int num = s[s[rt2].lch].dat - s[s[rt1].lch].dat; if (num >= k) { if (!s[rt1].lch) s[rt1].lch = newnode(0, s[rt1].l, mid); if (!s[rt2].lch) s[rt2].lch = newnode(0, s[rt2].l, mid); return query(s[rt1].lch, s[rt2].lch, k); } else { if (!s[rt1].rch) s[rt1].rch = newnode(0, mid + 1, s[rt1].r); if (!s[rt2].rch) s[rt2].rch = newnode(0, mid + 1, s[rt2].r); return query(s[rt1].rch, s[rt2].rch, k - num); } } } pret;
|