제출 #1316328

#제출 시각아이디문제언어결과실행 시간메모리
1316328penguin133Event Hopping (BOI22_events)C++17
0 / 100
53 ms20976 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

int n, q, par[20][100005];
pair <int, pair <int, int> > a[100005];
int s[100005], e[100005], p[100005];

struct node{
    int s, e, m;
    pair <int, int> val;
    node *l, *r;
    node (int _s, int _e){
        s = _s, e = _e, m = (s + e) >> 1;
        if (s != e)l = new node(s, m), r = new node(m + 1, e), val = min(l->val, r->val);
        else val = {a[s].second.first, s};
    }
    pair <int, int> qry(int a, int b){
        if (a == s && b == e)return val;
        else if(b <= m) return l->qry(a, b);
        else if(a> m) return r->qry(a,b);
        else return min(l->qry(a,m), r->qry(m+1,b));
    }
}*root;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].second.first >> a[i].first, a[i].second.second = i;
        s[i] = a[i].second.first;
        e[i] = a[i].first;
        p[i] = i;
    }
    sort (a + 1, a + n + 1);
    root=new node(1,n);
    priority_queue<pair <int, pair <int, int> > > pq;
    for (int i = 1; i <= n; i++) {
        int lo = 1, hi = i - 1, ans = hi + 1;
        while (lo <= hi) {
            int mid = (lo + hi) >> 1;
            if (a[mid].first >= a[i].second.first) ans = mid, hi = mid - 1;
            else lo = mid + 1;
        }
        pair <int, int> res = root->qry(ans, i);
        par[0][i] = (i== res.second?0:res.second);
    }
    for (int i = 1; i <= 19; i++) {
        for (int j = 1; j <= n; j++) par[i][j] = par[i - 1][par[i - 1][j]];
    }
    while (q--) {
        int l, r; cin >> l >> r;
        if (l == r) {
            cout << 0 << '\n';
            continue;
        }
        else if (s[r] <= e[l] && e[l] <= e[r]) {
            cout << 1 << '\n';
            continue;
        }
        int cur = r, ans = 0;
        for (int i = 19; i >= 0; i--) {
            int x = par[i][cur];
            if (!x) continue;
            if (e[x] < e[l]) continue;
            if (s[x] > e[l]) ans += (1<<i), cur = x;
        }
        if (par[0][cur]) {
            
            cur = par[0][cur];
            if (e[l] >= s[cur] && e[l] <= e[cur]) cout << ans + 2 << '\n';
            else cout << "impossible\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...