제출 #1253605

#제출 시각아이디문제언어결과실행 시간메모리
1253605NHristovPassport (JOI23_passport)C++20
6 / 100
358 ms67568 KiB
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

const int N = 2e5 + 5;

int n;
int ord;

vector < pair < int, int > > g[4 * N];
int leftChild[4 * N], rightChild[4 * N];

int build(int l, int r)
{
    if (l == r)
    {
        return l;
    }

    int mid = (l + r) / 2;

    int node = ++ord;
    int L = build(l, mid), R = build(mid + 1, r);

    leftChild[node] = L, rightChild[node] = R;

    g[L].push_back({node, 0});
    g[R].push_back({node, 0});

    return node;
}

void update(int node, int l, int r, int ql, int qr, int num)
{
    if (l > qr || r < ql)
    {
        return;
    }

    if (ql <= l && r <= qr)
    {
        g[node].push_back({num, 1});

        return;
    }

    int mid = (l + r) / 2;

    if (ql <= mid)
    {
        update(leftChild[node], l, mid, ql, qr, num);
    }

    if (mid + 1 <= qr)
    {
        update(rightChild[node], mid + 1, r, ql, qr, num);
    }
}

int dist[4 * N][2];

void bfs01(int type, int st)
{
    for (int i = 1; i <= ord; i++)
    {
        dist[i][type] = -1;
    }

    deque < int > dq;

    dist[st][type] = 0;
    dq.push_back(st);

    while (!dq.empty())
    {
        int u = dq.front();

        dq.pop_front();

        for (auto [v, w] : g[u])
        {
            if (dist[v][type] != -1)
            {
                continue;
            }

            dist[v][type] = dist[u][type] + w;

            if (w == 0)
            {
                dq.push_front(v);
            }
            else
            {
                dq.push_back(v);
            }
        }
    }
}

int ans[N];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;

    ord = n;

    int root = build(1, n);

    for (int i = 1; i <= n; i++)
    {
        int l, r;

        cin >> l >> r;

        update(root, 1, n, l, r, i);
        ans[i] = -1;
    }

    bfs01(0, 1);
    bfs01(1, n);

    priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > pq;

    for (int i = 1; i <= n; i++)
    {
        if (dist[i][0] != -1 && dist[i][1] != -1)
        {
            ans[i] = max(1, dist[i][0]) + max(1, dist[i][1]) - 1;
            pq.push({ans[i], i});
        }
    }

    while (!pq.empty())
    {
        int u = pq.top().second;

        pq.pop();

        for (auto [v, w] : g[u])
        {
            if (ans[v] == -1 || ans[v] > ans[u] + w)
            {
                ans[v] = ans[u] + w;
                pq.push({ans[v], v});
            }
        }
    }

    int t;

    cin >> t;

    while (t--)
    {
        int query;

        cin >> query;

        cout << ans[query] << endl;
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...