Submission #1176253

#TimeUsernameProblemLanguageResultExecution timeMemory
1176253VMaksimoski008Passport (JOI23_passport)C++17
100 / 100
997 ms94292 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;

const int maxn = 2e5 + 5;

int n, L[maxn], R[maxn], id[maxn], D[4*maxn][3];
vector<pii> G[4*maxn];

void build(int u, int tl, int tr) {
    if(tl == tr) {
        id[tl] = u;
    } else {
        int tm = (tl + tr) / 2;
        build(2*u, tl, tm);
        build(2*u+1, tm+1, tr);
        G[2*u].push_back({ u, 0 });
        G[2*u+1].push_back({ u, 0 });
    }
}

void add(int u, int tl, int tr, int s) {
    if(L[s] > tr || tl > R[s]) return ;

    if(L[s] <= tl && tr <= R[s]) {
        G[u].push_back({ id[s], 1 });
        return ;
    }

    int tm = (tl + tr) / 2;
    add(2*u, tl, tm, s);
    add(2*u+1, tm+1, tr, s);
}

void bfs(int t, int s) {
    priority_queue<pii, vector<pii>, greater<> > pq;
    for(int i=1; i<=4*n; i++) pq.push({ D[i][t], i });

    while(!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if(D[u][t] != d) continue;
        for(auto [v, w] : G[u])
            if(D[v][t] > d + w) pq.push({ D[v][t] = d + w, v });
    }
}

signed main() {
    cin >> n;
    build(1, 1, n);

    for(int j=0; j<3; j++)
        for(int i=1; i<=4*n; i++) D[i][j] = 1e6;

    for(int i=1; i<=n; i++) {
        cin >> L[i] >> R[i];
        if(L[i] == 1) D[id[i]][0] = 0;
        if(R[i] == n) D[id[i]][1] = 0;
        add(1, 1, n, i);
    }

    bfs(0, 1);
    bfs(1, n);
    for(int i=1; i<=n; i++)
        D[id[i]][2] = D[id[i]][0] + D[id[i]][1] + 1;
    bfs(2, n);

    int q; cin >> q;
    while(q--) {
        int x; cin >> x;
        cout << (D[id[x]][2] < 1e6 ? D[id[x]][2] : -1) << '\n';
    }
}
#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...