Submission #599163

#TimeUsernameProblemLanguageResultExecution timeMemory
599163SlavicGEvent Hopping (BOI22_events)C++17
100 / 100
466 ms43740 KiB
#include "bits/stdc++.h"
using namespace std;

const int N = 1e6 + 10, K = 23;
int l[N], r[N], n, q;
int jump[N][K];
pair<int, int> t[4 * N];
void modif(int i, int l, int r, int pos, pair<int, int> x) {
    if(l > pos || r < pos) return;
    if(l == pos && r == pos) {
        t[i] = min(t[i], x);
        return;
    }
    int mid = l + r >> 1;
    modif(2 * i, l, mid, pos, x);
    modif(2 * i + 1, mid + 1, r, pos, x);
    t[i] = min(t[2 * i], t[2 * i + 1]);
}
pair<int, int> query(int i, int l, int r, int tl, int tr) {
    if(l > tr || r < tl) return {INT_MAX, -1};
    if(l >= tl && r <= tr) return t[i];
    int mid = l + r >> 1;
    return min(query(2 * i, l, mid, tl, tr), query(2 * i + 1, mid + 1, r, tl, tr));
}

int main() {
    for(int i = 0; i < 4 * N; ++i) t[i] = {INT_MAX, -1};
    vector<int> v;
    cin >> n >> q;
    for(int i = 0; i < n; ++i) {
        cin >> l[i] >> r[i];
        v.push_back(l[i]);
        v.push_back(r[i]);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());

    for(int i = 0; i < n; ++i) {
        l[i] = lower_bound(v.begin(), v.end(), l[i]) - v.begin();
        r[i] = lower_bound(v.begin(), v.end(), r[i]) - v.begin();

        modif(1, 0, N - 1, r[i], make_pair(l[i], i));
    }
    for(int i = 0; i < n; ++i) {
        jump[i][0] = query(1, 0, N - 1, l[i], r[i]).second;
    }
    for(int j = 1; j < K; ++j) {
        for(int i = 0; i < n; ++i) {
            jump[i][j] = jump[jump[i][j - 1]][j - 1];
        }
    }

    while(q--) {
        int a, b; cin >> a >> b; --a, --b;
        if(a == b) {
            cout << "0\n";
            continue;
        }
        if(r[a] > r[b]) {
            cout << "impossible\n";
            continue;
        }
        if(r[a] >= l[b]) {
            cout << "1\n";
            continue;
        }
        int ans = 0;
        for(int j = K - 1; j >= 0; --j) {
            if(l[jump[b][j]] > r[a]) {
                b = jump[b][j];
                ans += (1 << j);
            }
        }
        ans += 2;
        b = jump[b][0];
        if(l[b] > r[a]) {
            cout << "impossible\n";
            continue;
        }
        cout << ans << "\n";
    }
}

Compilation message (stderr)

events.cpp: In function 'void modif(int, int, int, int, std::pair<int, int>)':
events.cpp:14:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   14 |     int mid = l + r >> 1;
      |               ~~^~~
events.cpp: In function 'std::pair<int, int> query(int, int, int, int, int)':
events.cpp:22:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   22 |     int mid = l + r >> 1;
      |               ~~^~~
#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...