Submission #1189097

#TimeUsernameProblemLanguageResultExecution timeMemory
1189097user149Event Hopping (BOI22_events)C++20
0 / 100
1603 ms217996 KiB
#include<bits/stdc++.h>
using namespace std;

using pii=pair<int,int>;

struct st{
    int l,r;
    pii val={-1,-1}; // {e,node}

    st* left=0;
    st* right=0;
    st(int L,int R){
        l=L;
        r=R;
    }

    void create(){
        if(l==r || left!=0) return;
        int mid=(l+r)/2;
        left=new st(l,mid);
        right=new st(mid+1,r);
    }

    void update(int i,pii v){
        create();
        if(l>i || r<i) return;
        if(l==r){
            val=max(val,v);
            return;
        }
        left->update(i,v);
        right->update(i,v);
        val=max(left->val,right->val);
    };

    pii query(int a,int b){
        create();
        if(l>b || r<a) return {-1,-1};
        if(a<=l && r<=b) return val;
        return max(left->query(a,b),right->query(a,b));
    }
};

int s[100005];
int e[100005];

st segtree(0,1e9+5);

int par[100005];

int main(){
    int N,Q;
    cin>>N>>Q;
    for(int i=1;i<=N;i++){
        cin>>s[i]>>e[i];
        segtree.update(s[i],{e[i],i});
    }
    for(int i=1;i<=N;i++){
        auto [end,node]=segtree.query(0,e[i]);
        if(end>e[i]) par[i]=node;
        else par[i]=-1;
    }
    for(int i=1;i<=Q;i++){
        int a,b;
        cin>>a>>b;
        if(a==b){
            cout<<"0\n";
            continue;
        }
        
        int ans=0;
        while(par[a]!=-1 && e[par[a]]<e[b]){
            a=par[a];
            ans++;
        }

        if(s[b]<=e[a] && e[a]<=e[b]){
            cout<<ans+1<<'\n';
        }
        else{
            a=par[a];
            ans++;
            if(s[b]<=e[a] && e[a]<=e[b]){
                cout<<ans+1<<'\n';
            }
            else cout<<"Impossible\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...
#Verdict Execution timeMemoryGrader output
Fetching results...