Submission #1333300

#TimeUsernameProblemLanguageResultExecution timeMemory
1333300rainmarEvent Hopping (BOI22_events)C++20
0 / 100
104 ms7464 KiB
#include<bits/stdc++.h>
using namespace std;

#define sg pair<int,int>
#define f first
#define s second




int main() {

    int jmp[100][18] = {};

    vector<sg> seg;

    int n,q; cin >> n >> q;

    vector<int> vals;

    for(int i = 0; i < n; i++) {
        int a,b; cin >> a >> b;
        seg.push_back({a,b});
        vals.push_back(a);
        vals.push_back(b);
    }
    vals.push_back(0);

    sort(vals.begin(),vals.end());
    vals.erase(unique(vals.begin(),vals.end()),vals.end());

    for(int i = 0; i < n; i++) {
        sg t = seg[i];
        t.f = lower_bound(vals.begin(),vals.end(), t.f) - vals.begin();
        t.s = lower_bound(vals.begin(),vals.end(), t.s) - vals.begin();
        seg[i] = t;
    }

    vector<vector<pair<sg,int>>> ev(vals.size());

    for(int i = 0; i < n; i++) {
        sg t = seg[i];
        ev[t.f].push_back({{t.f, t.s}, i});
        ev[t.s].push_back({{-t.f, t.s}, i}); 
    }


    //init to 0, so no worry
    jmp[0][0] = 0;
    multiset<pair<pair<int,int>,int>> sl;
    

    for(int i = 1; i < ev.size(); i++) {

        sort(ev[i].begin(), ev[i].end());
        reverse(ev[i].begin(), ev[i].end());
        
        for(auto e : ev[i]) {
            if(e.f.f > 0) {
                sl.insert(e);

                
                int ch = (*sl.begin()).second;

                if(seg[ch].second > seg[e.second].second) continue;

                jmp[e.second][0] = ch;
                int o = e.second;
                for(int j = 1; j < 18; j++) {
                    jmp[o][j] = jmp[jmp[o][j-1]][j-1];
                }
            } else {
                auto it = sl.find({{e.f.f * (-1), e.f.s}, e.second});
                if(it != sl.end()) sl.erase(it);
            }
        }

    }


    for(int k = 0; k < q; k++) {
        int a,b; cin >> a >> b;

        a--; b--;

        int x1,x2;
        x1 = seg[a].f;
        x2 = seg[a].s;

        int ans = 0;

        if(a == b) {
            cout << 0 << endl;
            continue;
        }

        if(seg[a].second > seg[b].second) {
            cout << "impossible" << endl;
            continue;
        }

        if(seg[b].first <= seg[a].second) {
            cout << "1" << endl;
            continue;
        }

        for(int i = 17; i >= 0; i--) {
            //if 2 pow i back is still before it
            int y = jmp[b][i];
            sg t = seg[y];

            if(x2 < t.first) {
                ans += (1 << i);
                b = y;
            }
        }

        ans++;
        b = jmp[b][0];

        if((seg[b].first <= x2 and seg[b].second >= x2) or a==b) {
            cout << ans + 1 << endl;
            continue;
        } else {
            cout << "impossible" << endl;
            continue;
        }

    }

}
#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...