Submission #1347007

#TimeUsernameProblemLanguageResultExecution timeMemory
1347007KindaGoodGamesEvent Hopping (BOI22_events)C++20
40 / 100
1595 ms20796 KiB
// #pragma GCC optimize("O3,unroll-loops,Ofast")
#include<bits/stdc++.h>


#define ll long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>

using namespace std;

int INF = numeric_limits<int>::max()/2;

struct SegmentTree{
    int len = 1;
    vector<pii> S; 
    SegmentTree(int n){
        while(len < n) len <<= 1;

        S.resize(2*len, {INF,-1}); 
    }

    void upd(int i, pii v){
        i += len;
        S[i] = min(S[i],v);
        for( i /= 2; i > 0; i/=2){
            S[i] = min(S[i*2],S[i*2+1]);
        }
    }

    pii query(int ql, int qr, int l = 0, int r = -2, int i = 1){
        if(r == -2) r = len;
        if(ql <= l && r <= qr) return S[i];
        if(r <= ql|| qr <= l) return {INF,-1};

        int mid = (l+r)/2;
        return min(query(ql,qr,l,mid,i*2),query(ql,qr,mid,r,i*2+1));
    }
};

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,q;
    cin >> n >> q;

    vector<pii>arr(n); 

    for(int i = 0; i < n; i++){
        int a,b;
        cin >> a >>b;
        arr[i] = {a,b}; 
    }   

    int MAXA = 0;
    {
        set<int> occ;
        for(int i = 0; i < n; i++){
            occ.insert(arr[i].first);
            occ.insert(arr[i].second);
        }

        vector<int> sorted(occ.begin(),occ.end());
        map<int,int> toInd;
        for(int i = 0; i < sorted.size(); i++){
            toInd[sorted[i]] = i; 
        }
        MAXA= sorted.size()-1;
        for(int i = 0; i < n; i++){
            arr[i] = {toInd[arr[i].first],toInd[arr[i].second]};
        }
    }

    SegmentTree seg(MAXA+1);
    for(int i = 0; i < n; i++){
        seg.upd(arr[i].second, {arr[i].first,i});
    }

    vector<int> prev(n);
    for(int i = 0; i < n; i++){
        prev[i] = seg.query(arr[i].first,arr[i].second+1).second;
    }


    while(q--){
        int s,t;
        cin >> s >> t;
        s--;t--; 

        int cnt = 0;
        int v = t; 
        while(v != -1){
            if(v == s) break;
            cnt++;
            if(arr[s].second >= arr[v].first && arr[s].second <= arr[v].second){
                break;
            }
            if(v == prev[v]){
                v = -1;
                break;
            }
            v = prev[v];
        }

        if(v == -1){
            cout << "impossible\n";
            continue;
        }else{
            cout << cnt << "\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...