제출 #714375

#제출 시각아이디문제언어결과실행 시간메모리
714375ibrahim001Event Hopping (BOI22_events)C++14
100 / 100
644 ms23652 KiB
#include "bits/stdc++.h"
#define intt long long
#define pb push_back
#define endl '\n'
#define F first
#define S second
#define pii pair<int,int>
#define pll pair<intt,intt>
#define ld long double
#define fast_io ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int sz = 2e5+5;
const int inf = 1e9+7;
int a[sz], b[sz];
map<int,int> mp;
pii st[sz<<2];
int par[sz][20];
void build(int l, int r, int in){
    st[in]={inf, inf};
    if ( l == r ){
        return;
    }
    int mid = (l+r)>>1;
    build(l, mid, in<<1);
    build(mid+1, r, in<<1|1);
}
void update(int l, int r, int in, int x, int val){
    if ( x > r or x < l )   return;
    if ( l == r ){
        st[in] = min(st[in], {a[val], val});
        return;
    }
    int mid = (l+r)>>1;
    update(l, mid, in<<1, x, val);
    update(mid+1, r, in<<1|1, x, val);
    st[in] = min(st[in<<1], st[in<<1|1]);
}
pii getans(int a, int b, int l, int r, int in){
    if ( l > b or r < a )   return {inf, inf};
    if ( a <= l and r <= b )    return st[in];
    int mid = (l+r)>>1;
    return min(getans(a, b, l, mid, in<<1), getans(a, b, mid+1, r, in<<1|1));
}
int i,j;
int main(){
    int n, q;
    cin >> n >> q;
    for ( i = 1; i <= n; i++ ){
        cin >> a[i] >> b[i];
        mp[a[i]];
        mp[b[i]];
    }
    int cnt = 0;
    for ( pii i : mp ){
        mp[i.F] = ++cnt;
    }
    build(1, n*2, 1);
    for ( i = 1; i <= n; i++ ){
        a[i] = mp[a[i]];
        b[i] = mp[b[i]];
        update(1, n*2, 1, b[i], i);
    }
    for ( i = 1; i <= n; i++ ){
        par[i][0] = getans(a[i], b[i], 1, n*2, 1).S;
        if ( par[i][0] == i )    par[i][0] = 0;
    }
    for ( i = 1; i < 20; i++ ){
        for ( j = 1; j <= n; j++ )  par[j][i] = par[par[j][i-1]][i-1];
    }
    while(q--){
        int x, y;
        cin >> x >> y;
        if ( x == y ){
            cout << 0 << endl;
            continue;
        }
        if ( b[x] > b[y] ){
            cout << "impossible" << endl;
            continue;
        }
        if ( b[x] >= a[y] and b[x] <= b[y] ){
            cout << 1 << endl;
            continue;
        }
        int res = 0;
        for ( i = 19; i >= 0; i-- ){
            if ( a[par[y][i]] > b[x] ){
                y = par[y][i];
                res+=(1<<i);
            }
        }
        y = par[y][0];
        res++;
        if ( y == 0 ){
            cout << "impossible" << endl;
            continue;
        }
        cout << res+1 << endl;
    }
}
#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...