FHQ Treap 37分求调
查看原帖
FHQ Treap 37分求调
912445
ZHANGyutao123楼主2023/11/26 17:49
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 3;
int cnt = 0, root = 0, n;
struct node
{
    int ls, rs, key, pri, size;
} t[N];
inline void newnode(int x)
{
    t[++cnt].size = 1;
    t[cnt].ls = t[cnt].rs = 0;
    t[cnt].key = x;
    t[cnt].pri = rand();
}
inline void update(int u) { t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1; }
inline void spilt(int u, int x, int &l, int &r)
{
    if (!u)
    {
        l = r = 0;
        return;
    }
    if (t[u].key <= x)
    {
        l = u;
        spilt(t[u].rs, x, t[u].rs, r);
    }
    else
    {
        r = u;
        spilt(t[u].ls, x, l, t[u].ls);
    }
    update(u);
}
inline int merge(int l, int r)
{
    if (!l || !r)
        return l + r;
    if (t[l].pri > t[r].pri)
    {
        t[l].rs = merge(t[l].rs, r);
        update(l);
        return l;
    }
    else
    {
        t[r].ls = merge(l, t[r].ls);
        update(r);
        return r;
    }
}
inline void insert(int x)
{
    int l, r;
    spilt(root, x, l, r);
    newnode(x);
    int aa = merge(l, cnt);
    root = merge(aa, r);
}
inline void del(int x)
{
    int l, r, p;
    spilt(root, x - 1, l, r);
    spilt(l, x - 1, l, p);
    p = merge(t[p].ls, t[p].rs);
    root = merge(merge(l, p), r);
}
inline void Rank(int x)
{
    int l, r;
    spilt(root, x - 1, l, r);
    printf("%d\n", t[l].size + 1);
    root = merge(l, r);
}
inline int kth(int u, int k)
{
    if (k == t[t[u].ls].size + 1)
        return u;
    if (k <= t[t[u].ls].size)
        return kth(t[u].ls, k);
    if (k > t[t[u].ls].size)
        return kth(t[u].rs, k - t[t[u].ls].size - 1);
}
inline void pre(int x)
{
    int l, r;
    spilt(root, x - 1, l, r);
    printf("%d\n", t[kth(l, t[l].size)].key);
    root = merge(l, r);
}
inline void suc(int x)
{
    int l, r;
    spilt(root, x, l, r);
    printf("%d\n", t[kth(r, 1)].key);
    root = merge(l, r);
}
int main()
{
    srand(time(NULL));
    scanf("%d", &n);
    while (n--)
    {
        int op, x;
        scanf("%d%d", &op, &x);
        if (op == 1)
            insert(x);
        else if (op == 2)
            del(x);
        else if (op == 3)
            Rank(x);
        else if (op == 4)
            printf("%d\n", t[kth(root, x)].key);
        else if (op == 5)
            pre(x);
        else
            suc(x);
    }
    return 0;
}
2023/11/26 17:49
加载中...