Submission #915300

#TimeUsernameProblemLanguageResultExecution timeMemory
915300minhnhatnoePassport (JOI23_passport)C++17
6 / 100
172 ms99652 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int LG = 20;

vector<pair<int, int>> a[20], b[20];

signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int n; cin >> n;
    a[0].resize(n), b[0].resize(n);
    for (int i=0; i<n; i++){
        cin >> a[0][i].first >> b[0][i].first;
        a[0][i].first--, b[0][i].first--;
        a[0][i].second = b[0][i].second = i;
    }

    for (int i=1; i<LG; i++){
        a[i].resize(n), b[i].resize(n);
        for (int j1=0, j2=1<<(i-1); j2<n; j1++, j2++){
            a[i][j1] = min(a[i-1][j1], a[i-1][j2]);
            b[i][j1] = max(b[i-1][j1], b[i-1][j2]);
        }
    }

    const int XX = 0;
    const int XY = XX + n;
    const int YX = XY + n;
    const int YY = YX + n;
    const int SIZE = YY + 1;

    vector<vector<pair<int, bool>>> g(SIZE);
    for (int i=0; i<n; i++){
        int l = a[0][i].first, r = b[0][i].first;
        int lg = 31 - __builtin_clz(r - l + 1);
        if (b[0][i].first == n-1){
            g[XY+i].emplace_back(XX+i, 0);
            g[YY].emplace_back(YX+i, 0);
        }
        else{
            int mxpos = max(b[lg][l], b[lg][r - (1 << lg) + 1]).second;
            g[XX+mxpos].emplace_back(XX+i, 1);
            g[XY+mxpos].emplace_back(XY+i, 1);
            g[YX+mxpos].emplace_back(YX+i, 1);
        }

        if (a[0][i].first == 0){
            g[YX+i].emplace_back(XX+i, 0);
            g[YY].emplace_back(XY+i, 0);
        }
        else{
            int mnpos = min(a[lg][l], a[lg][r - (1 << lg) + 1]).second;
            g[XX+mnpos].emplace_back(XX+i, 1);
            g[XY+mnpos].emplace_back(XY+i, 1);
            g[YX+mnpos].emplace_back(YX+i, 1);
        }
    }

    vector<int> dist(SIZE, INT_MAX);
    dist[YY] = 0;
    for (deque<int> q = {YY}; q.size();){
        int v = q.front(); q.pop_front();
        for (const pair<int, bool> &e: g[v]){
            if (dist[v] + e.second < dist[e.first]){
                dist[e.first] = dist[v] + e.second;
                if (e.second) q.push_back(e.first);
                else q.push_front(e.first);
            }
        }
    }

    int q; cin >> q;
    while (q--){
        int x; cin >> x; x--;
        if (dist[x] == INT_MAX) cout << "-1\n";
        else cout << dist[x]+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...