Submission #1370376

#TimeUsernameProblemLanguageResultExecution timeMemory
1370376pirmyratgPassport (JOI23_passport)C++20
100 / 100
744 ms87644 KiB
#include "bits/stdc++.h"

using namespace std;

#define ll long long
#define ff first
#define ss second
#define pb push_back
#define SZ(s) (int)s.size()

const int N = 200005;
const int INF = 1e9;

int n;
int l[N], r[N], pos[N];
int dl[5 * N], dr[5 * N], d[5 * N];
vector <int> g[5 * N];

void build(int nd, int l, int r) {
    if(l == r) {
        pos[l] = nd;
        return;
    }

    int md = (l + r) / 2;

    build(nd * 2, l, md);
    build(nd * 2 + 1, md + 1, r);
}

void add(int nd, int l, int r, int ql, int qr, int v) {
    if(r < ql or qr < l) return;

    if(ql <= l and r <= qr) {
        g[v].pb(n + nd);
        g[n + nd].pb(v);
        return;
    }

    int md = (l + r) / 2;

    add(nd * 2, l, md, ql, qr, v);
    add(nd * 2 + 1, md + 1, r, ql, qr, v);
}

void bfs(int d[]) {
    set <pair <int, int>> st;

    for(int i = 1; i <= n; i++) {
        st.insert({d[i], i});
    }

    while(SZ(st)) {
        auto it = st.begin();
        int v = it->ss;
        st.erase(it);

        if(v <= n) {
            for(int u = pos[v]; u >= 1; u /= 2) {
                if(d[n + u] > d[v]) {
                    if(st.find({d[n + u], n + u}) != st.end()) st.erase({d[n + u], n + u});
                    d[n + u] = d[v];
                    st.insert({d[n + u], n + u});
                }
            }

            continue;
        }

        for(auto u : g[v]) {
            if(d[u] > d[v] + 1) {
                if(st.find({d[u], u}) != st.end()) st.erase({d[u], u});
                d[u] = d[v] + 1;
                st.insert({d[u], u});
            }
        }
    }
}

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

    cin >> n;

    build(1, 1, n);

    for(int i = 1; i <= n; i++) {
        cin >> l[i] >> r[i];
        add(1, 1, n, l[i], r[i], i);
    }

    for(int i = 1; i <= 5 * n; i++) {
        dl[i] = dr[i] = d[i] = INF;
    }

    dl[1] = 0;
    dr[n] = 0;

    bfs(dl);
    bfs(dr);

    dl[1] = 1;
    dr[n] = 1;

    for(int i = 1; i <= n; i++) {
        d[i] = dl[i] + dr[i];
    }

    bfs(d);

    for(int i = 1; i <= n; i++) {
        if(d[i] >= INF) d[i] = -1;
        else d[i]--;
    }

    int q;
    cin >> q;

    while(q--) {
        int x;
        cin >> x;
        cout << d[x] << '\n';
    }

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