Submission #1294992

#TimeUsernameProblemLanguageResultExecution timeMemory
1294992mrc2407Event Hopping (BOI22_events)C++20
100 / 100
146 ms16260 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5 + 5, INF = 21e8;
int N, Q;
pair<int, int> arr[MAXN];
vector<int> v;

int graph[MAXN][20];

struct segment{
    int tree[4 * MAXN], number[4 * MAXN];

    void update(int node, int s, int e, int k, int val, int num){
        int mid = (s + e) >> 1;

        if(s == e){
            if(tree[node] > val){
                tree[node] = val;
                number[node] = num;
            }   
            return;
        }

        if(k <= mid) update(node * 2, s, mid, k, val, num);
        else update(node * 2 + 1, mid + 1, e, k, val, num);

        if(tree[node * 2] <= tree[node * 2 + 1]) tree[node] = tree[node * 2], number[node] = number[node * 2];
        else tree[node] = tree[node * 2 + 1], number[node] = number[node * 2 + 1];
    }

    pair<int, int> query(int node, int s, int e, int l, int r){
        int mid = (s + e) >> 1;

        if(e < l || r < s) return {INF, 0};
        if(l <= s && e <= r) return {tree[node], number[node]};

        return min(query(node * 2, s, mid, l, r), query(node * 2 + 1, mid + 1, e, l, r));
    }
}seg;

int main(void){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int i, j;
    cin >> N >> Q;

    for(i = 0;i < 4 * MAXN;i++) seg.tree[i] = INF;
    
    for(i = 1;i <= N;i++){
        int a, b; cin >> a >> b;

        arr[i] = {a, b};
        v.push_back(a); 
        v.push_back(b);
    }

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

    for(i = 1;i <= N;i++){
        arr[i].first = (lower_bound(v.begin(), v.end(), arr[i].first) - v.begin()) + 1;
        arr[i].second = (lower_bound(v.begin(), v.end(), arr[i].second) - v.begin()) + 1;
    }

    for(i = 1;i <= N;i++) seg.update(1, 1, 2 * N, arr[i].second, arr[i].first, i);

    for(i = 1;i <= N;i++){
        auto A = seg.query(1, 1, 2 * N, arr[i].first, arr[i].second);

        graph[i][0] = A.second;
        //cout << i << " : " << A.second << "\n";
    }

    for(i = 1;i < 20;i++){
        for(j = 1;j <= N;j++) graph[j][i] = graph[graph[j][i - 1]][i - 1];
    }

    while(Q--){
        int a, b; cin >> a >> b;
        int ans = 0;

        if(a == b){
            cout << 0 << "\n";
            continue;
        }
        if(arr[b].second < arr[a].second) {
            cout << "impossible\n";
            continue;
        }

        for(i = 19;i >= 0;i--){
            if(arr[a].second < arr[graph[b][i]].first) {
                b = graph[b][i], ans += (1 << i);
            }
        }
        if(arr[b].first > arr[a].second) ans++, b = graph[b][0];
        if(arr[b].first > arr[a].second) cout << "impossible\n";
        else cout << ans + 1 << "\n";
    }
    return 0;
}
#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...