Submission #1188175

#TimeUsernameProblemLanguageResultExecution timeMemory
1188175UasoniEvent Hopping (BOI22_events)C++20
100 / 100
455 ms135384 KiB
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int, int>

const int MAXN = 1e5+5, LMAXN = 20, MAXP = 1e9+5, INF = 2e9;
int n, q, l[MAXN], r[MAXN];

struct N {
    pii v = {INF, 0}; int l, r;
} stree[80*MAXN]; int ptr = 1;
void create(int i) {
    if(!stree[i].l) stree[i].l = ++ptr;
    if(!stree[i].r) stree[i].r = ++ptr;
}
void update(int p, pii v, int i = 1, int l = 1, int r = MAXP) {
    if(l == r) return void(stree[i].v = min(stree[i].v, v));
    create(i);
    int mid = (l+r)/2;
    if(p <= mid) update(p, v, stree[i].l, l, mid);
    else update(p, v, stree[i].r, mid+1, r);
    stree[i].v = min(stree[stree[i].l].v, stree[stree[i].r].v);
}
pii query(int lq, int rq, int i = 1, int l = 1, int r = MAXP) {
    if(!i) return {INF, 0};
    if(lq <= l && r <= rq) return stree[i].v;
    int mid = (l+r)/2; pii ret = {INF, 0};
    if(lq <= mid) ret = min(ret, query(lq, rq, stree[i].l, l, mid));
    if(rq > mid) ret = min(ret, query(lq, rq, stree[i].r, mid+1, r));
    return ret;
}

int get_nxt(int i) {
    pii ret = query(l[i], r[i]);
    if(ret.first >= l[i]) return 0;
    else return ret.second;
}

int jmp[MAXN][LMAXN];
void precomp_jmp() {
    for(int i = 1; i <= n; i++) jmp[i][0] = get_nxt(i);
    for(int j = 1; j < LMAXN; j++)
        for(int i = 1; i <= n; i++)
            jmp[i][j] = jmp[jmp[i][j-1]][j-1];
}

int make_jmp(int s, int e) {
    if(s == e) return 0;
    if(r[s] > r[e]) return -1;
    if(l[e] <= r[s]) return 1;
    int ans = 0;
    for(int j = LMAXN-1; j >= 0; j--) {
        if(jmp[e][j] && l[jmp[e][j]] > r[s]) {
            e = jmp[e][j];
            ans += (1 << j);
        }
    }
    if(!e) return -1;
    if(!jmp[e][0]) return -1;
    else return ans+2;
}

int main() {
    cin >> n >> q;
    for(int i = 1; i <= n; i++) {
        cin >> l[i] >> r[i];
        update(r[i], {l[i], i});
    }
    precomp_jmp();
    while(q--) {
        int s, e; cin >> s >> e;
        int ans = make_jmp(s, e);
        if(ans == -1) cout << "impossible\n";
        else cout << ans << '\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...