// Starcraft 2 enjoyer //
#include <bits/stdc++.h>
#include "teams.h"
using namespace std;
#define LSOne(X) ((X) & -(X))
const int N = 5e5 + 5;
const int M = 21e4 + 5;
const int LG = 31;
const int C = 26;
const int INF = 1e9 + 5;
const int P = 31;
const int MOD = 1e9 + 7;
struct PersistentSegmentTree
{
    struct Node
    {
        int sum;
        Node *le, *ri;
        int val(Node *cur)
        {
            return cur ? cur->sum : 0;
        }
        Node(int i)
        {
            sum = i;
            le = ri = NULL;
        }
        Node(Node *cur)
        {
            if (!cur)
            {
                sum = 0;
                return;
            }
            sum = cur->sum;
            le = cur->le;
            ri = cur->ri;
        }
        Node(Node *l, Node *r)
        {
            sum = val(l) + val(r);
            le = l;
            ri = r;
        }
    } *root[N];
    int n;
    Node *build(int l, int r)
    {
        if (l == r)
        {
            return new Node(0);
        }
        else
        {
            int m = (l + r) / 2;
            return new Node(build(l, m), build(m + 1, r));
        }
    }
    Node *update(Node *cur, int v, int p, int l, int r)
    {
        if (l == r)
        {
            return new Node(v + cur->sum);
        }
        else
        {
            int m = (l + r) / 2;
            if (p <= m)
            {
                return new Node(update(cur->le, v, p, l, m), cur->ri);
            }
            else
            {
                return new Node(cur->le, update(cur->ri, v, p, m + 1, r));
            }
        }
    }
    int get(Node *cur, int l, int r, int tl, int tr)
    {
        if (tl > tr)
            return 0;
        if (tl <= l && r <= tr)
        {
            return cur->sum;
        }
        else
        {
            int m = (l + r) / 2;
            return get(cur->le, l, m, tl, min(tr, m)) + get(cur->ri, m + 1, r, max(tl, m + 1), tr);
        }
    }
    PersistentSegmentTree(int n) : n(n) { root[0] = build(0, n - 1); };
    void add(int i, int j)
    {
        root[j] = new Node(root[i]);
    }
    void update(int i, int v, int p)
    {
        root[i] = update(root[i], v, p, 0, n - 1);
    }
    int get(int i, int l, int r)
    {
        if (l > r)
            return 0;
        return get(root[i], 0, n - 1, l, r);
    }
} pst(N);
int n, q, a[N], b[N], k[N], last, offset, m;
pair<int, int> rng[N];
void init(int N, int A[], int B[])
{
    n = N;
    for (int x = 1; x <= n; x++)
    {
        a[x] = A[x];
        b[x] = B[x];
        rng[x] = {a[x], b[x]};
    }
    sort(rng + 1, rng + n + 1);
    last = 0;
    for (int x = 1; x <= n; x++)
    {
        auto &[l, r] = rng[x];
        while (last < l)
        {
            pst.add(last, last + 1);
            last++;
        }
        pst.update(last, 1, r);
    }
    for(int x = last; x <= n; x++)
    {
        pst.add(x, x + 1);
    }
}
int can(int M, int K[])
{
    m = M;
    for(int x = 0; x < m; x++)
    {
        k[x] = K[x];
    }
    last = 0;
    offset = 0;
    sort(k, k + m);
    for (int x = 0; x < m; x++)
    {
        if (k[x] > last)
        {
            last = k[x];
            offset = 0;
        }
        int l = last, r = n, ans = -1;
        // cout << k[x] << " " << offset << "v\n";
        // cout << pst.get(k[x], last, n + 1) << "w\n";
        while (l <= r)
        {
            int m = (l + r) / 2;
            if (pst.get(k[x], last, m) + offset < k[x])
            {
                l = m + 1;
            }
            else
            {
                ans = m;
                r = m - 1;
            }
        }
        // cout << offset << " " << ans << "\n";
        if (ans == -1)
        {
            last = -1;
            break;
        }
        else
        {
            int i = k[x] - (pst.get(k[x], last, ans - 1) + offset);
                offset = -i;
        }
        last = ans;
    }
    if (last == -1)
        return 0;
    else
        return 1;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |