| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1282169 | iamhereforfun | 팀들 (IOI15_teams) | C++20 | 0 ms | 0 KiB | 
// Starcraft 2 enjoyer //
#include <bits/stdc++.h>
using namespace std;
#define LSOne(X) ((X) & -(X))
const int N = 1e5 + 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;
pair<int, int> rng[N];
int can(int m, int k[])
{
    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) + offset << "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;
}
void solve()
{
    cin >> n;
    for (int x = 1; x <= n; x++)
    {
        cin >> a[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);
    }
    cin >> q;
    for (int x = 0; x < q; x++)
    {
        int m;
        cin >> m;
        for (int y = 0; y < m; y++)
        {
            cin >> k[y];
        }
        cout << can(m, k) << "\n";
    }
}
signed main()
{
    freopen("CP.INP", "r", stdin);
    freopen("CP.OUT", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
