Submission #1257397

#TimeUsernameProblemLanguageResultExecution timeMemory
1257397notisoraPassport (JOI23_passport)C++20
100 / 100
452 ms48324 KiB
///NotIsora
///This is my last dance
#include<bits/stdc++.h>
#define modulo 1000000007
#define fi first
#define se second
#define sq(x) (x)*(x)
#define ll long long
#define ld long double
#define el '\n'
#define pb push_back
///#define int long long

using namespace std;

const int INF=1e8;
const int N=2e5+5;
vector<int>st[N*4];
int n,q;
int ans[N];
pair<int,int>Passport[N];
bool vis[N];
bool visst[N*4];

void update(int u,int v,int val,int node=1,int l=1,int r=n){
    if (u>r || l>v) return;
    if (u<=l && r<=v){
        st[node].pb(val);
        return;
    }
    int m=(l+r)>>1;
    update(u,v,val,node*2,l,m);
    update(u,v,val,node*2+1,m+1,r);
}

void dijkstra(vector<int>&d){

    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
    for(int i=1;i<=n;i++) vis[i]=0;
    for(int i=1;i<=n*4;i++) visst[i]=0;

    for(int i=1;i<=n;i++){
        if (d[i]>=INF) continue;
        pq.push({d[i],i});
    }

    while(!pq.empty()){
        int dis=pq.top().fi;
        int pos=pq.top().se;
        pq.pop();
        if (vis[pos]) continue;
        vis[pos]=1;

        int node=1,l=1,r=n;
        while(16032008){
            if (!visst[node]){
                visst[node]=1;
                for(int&u:st[node]){
                    if (d[u]>dis+1){
//                        cout<<pos<<" "<<u<<el;
                        d[u]=dis+1;
                        pq.push({d[u],u});
                    }
                }
            }
            if (l==r) break;
            int m=(l+r)>>1;
            if (pos<=m){
                node=node*2;
                r=m;
            }
            else{
                node=node*2+1;
                l=m+1;
            }
//            cout<<el;
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //freopen("i.INP","r",stdin);
    cin>>n;
    vector<int>dL(n+1,INF),dR(n+1,INF),dp(n+1,INF);

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

    dL[1]=0;
    dR[n]=0;

    dijkstra(dL);
    dijkstra(dR);

    for(int i=1;i<=n;i++){
        dp[i]=dL[i]+dR[i];
        if (i>1 && i<n) dp[i]--;
        if (Passport[i].fi==1 && Passport[i].se==n) dp[i]=1;
    }
    dijkstra(dp);

    int q;
    cin>>q;
    while(q--){
        int z;
        cin>>z;
        if (dp[z]>n*2) cout<<-1;
        else cout<<dp[z];
        cout<<el;
    }
}
#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...