Submission #1212910

#TimeUsernameProblemLanguageResultExecution timeMemory
1212910BigBadBullyEvent Hopping (BOI22_events)C++20
25 / 100
1596 ms11904 KiB
#include <bits/stdc++.h>
//#define int long long
#define pii pair<int, int>
#define ff first
#define ss second
using ll = long long;
using namespace std;
const ll mod = 998244353;
//const int inf = 1e18;
const int maxn = 1 << 21;

void solve()
{
    int n,q;
    cin >> n >> q;
    vector<pii> segs(n);
    for (auto&x:segs)cin>>x.ff>>x.ss;
    vector<int> cs;
    for (auto x:segs)cs.push_back(x.ff),cs.push_back(x.ss);
    sort(cs.begin(),cs.end());
    cs.resize(unique(cs.begin(),cs.end()) - cs.begin());
    for (auto&x:segs)x.ff = lower_bound(cs.begin(),cs.end(),x.ff)-cs.begin(),
                    x.ss = lower_bound(cs.begin(),cs.end(),x.ss)-cs.begin();
    int k = cs.size();
    vector<vector<int>> add(k);
    for (auto&x:segs)add[x.ff].push_back(x.ss);
    for (auto&v:add)if (v.size())sort(v.begin(),v.end());
    while(q--)
    {
        int a,b;
        cin >> a >> b;
        if (a==b)
        {
            cout << "0\n";continue;
        }
        if (segs[--a].ss > segs[--b].ss)
        {
            cout << "impossible\n";
            continue;
        }
        int e = segs[b].ss;
        vector<int> jmp(e+2,-1);
        int total = -1;
        for (int i = 0; i < e; i++)
        {
            for (int x : add[i])
            {
                if (x <= e)
                    total = max(total,x);
                if (i==segs[b].ff)
                    total = e+1;
            }
            if (total >= i)
                jmp[i] = total;
        }
        vector<int> dp(e+2,-1);
        dp[e+1] = 0;
        dp[e] = 1;
        for (int i = e-1; i >= 0; i--)
            if (jmp[i] >= 0 && dp[jmp[i]] >= 0)
                dp[i] = 1 + dp[jmp[i]];
        if (dp[segs[a].ss] < 0)
            cout << "impossible\n";
        else
            cout << dp[segs[a].ss] << '\n';
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    srand(time(0));
    
    int t = 1;
    //cin >> t;
    while (t--)
        solve();
}
#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...