Submission #1320064

#TimeUsernameProblemLanguageResultExecution timeMemory
1320064888313666Event Hopping (BOI22_events)C++20
20 / 100
78 ms23344 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _ <<' '<<
#define print(x) cout<<#x<<": "<<(x)<<endl

int n,m=0,q,k;
vector<int> x, s, e, idx;
vector<vector<int>> st, mn, qt;

int fmn(const int l, const int r) {
    const auto d=r-l;
    const auto lg=31-__builtin_clz(d);
    if ((1<<lg)==d) return mn[lg][l];
    if (st[lg][l]<st[lg][r-(1<<lg)]) return mn[lg][l];
    return mn[lg][r-(1<<lg)];
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);
    cin>>n>>q;
    k=32-__builtin_clz(n);
    s.resize(n);
    e.resize(n);
    x.resize(n);
    for (int i=0; i<n; i++) {
        cin>>s[i]>>e[i];
    }
    iota(x.begin(), x.end(), 0);
    sort(x.begin(), x.end(), [](const int a, const int b){if (e[a]<e[b]) return true; if (e[a]>e[b]) return false; if (s[a]<s[b]) return true; return false;});
    idx.resize(n);
    for (int i=0; i<n; i++) idx[i]=e[x[i]];
    e=move(idx);
    idx.resize(n);
    for (int i=0; i<n; i++) idx[i]=s[x[i]];
    s=move(idx);
    idx.resize(n);
    for (int i=0; i<n; i++) idx[x[i]]=i;
    st.assign(k, vector<int>(n));
    mn.assign(k, vector<int>(n, -1));
    for (int i=0; i<n; i++) st[0][i]=s[i], mn[0][i]=i;
    for (int i=1; i<k; i++) for (int j=0; j+(1<<i-1)<n; j++) {
        if (st[i-1][j]<st[i-1][j+(1<<i-1)]) {
            st[i][j]=st[i-1][j];
            mn[i][j]=mn[i-1][j];
        } else {
            st[i][j]=st[i-1][j+(1<<i-1)];
            mn[i][j]=mn[i-1][j+(1<<i-1)];
        }
    }
    //print(n);
    qt.assign(k, vector<int>(n));
    for (int i=0; i<n; i++) {
        const auto l=lower_bound(e.begin(), e.end(), s[i])-e.begin(); //inc
        const auto r=upper_bound(e.begin(), e.end(), e[i])-e.begin(); //exc
        if (l>=r) qt[0][i]=i;
        else qt[0][i]=fmn(l, r);
    }
    //print(k);
    for (int i=1; i<k; i++) for (int j=0 ; j<n; j++) {
        qt[i][j]=qt[i-1][qt[i-1][j]];
    }
    //print(q);
    for (int i=0; i<q; ++i) {
        int a, b;
        cin>>a>>b;
        if (a==b) {
            cout<<"0\n";
            continue;
        }
        a=idx[--a], b=idx[--b];
        if (e[a]>=e[b]) {
            cout<<"impossible\n";
            continue;
        }
        if (e[a]>=s[b]) {
            cout<<"1\n";
            continue;
        }
        int res=0;
        for (int j=k-1; j>=0; --j) if (s[qt[j][b]]>e[a]) {
            b=qt[j][b];
            res+=1<<j;
        }
        b=qt[0][b];
        ++res;
        if (e[a]>=s[b]) {
            cout<<++res<<'\n';
            continue;
        }
        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...