Submission #1278052

#TimeUsernameProblemLanguageResultExecution timeMemory
1278052LudisseyEvent Hopping (BOI22_events)C++20
30 / 100
275 ms115380 KiB
#include <bits/stdc++.h> #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define int long long using namespace std; const int LOG=24; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,q; cin >> n >> q; vector<pair<int,int>> a(n); vector<vector<pair<int,int>>> lift(n+1,vector<pair<int,int>>(LOG,{-1,n})); vector<pair<pair<int,int>,int>> ev; vector<int> mn(n); for (int i = 0; i < n; i++) cin >> a[i].first >> a[i].second, ev.push_back({{a[i].first,0},i}), ev.push_back({{a[i].second,1},i}); sort(all(ev)); int mx=-1; int mxI=n; set<int> evs; unordered_map<int,int> um; for (int i = 0; i < sz(ev); i++) { evs.insert(ev[i].first.first); if(ev[i].first.second==0){ if(a[ev[i].second].second>mx){ mxI=ev[i].second; mx=a[ev[i].second].second; } } else { lift[ev[i].second][0]={mx,mxI}; } } int k=0; for (auto u : evs) um[u]=k++; vector<vector<int>> mn_table(k,vector<int>(LOG,1e12)); for (int i = 0; i < n; i++) { mn_table[um[a[i].second]][0]=min(mn_table[um[a[i].second]][0],a[i].first); } for (int j = 1; j < LOG; j++) { for (int i = 0; i+(1<<(j-1)) < k; i++) { mn_table[i][j]=min(mn_table[i][j-1],mn_table[i+(1<<(j-1))][j-1]); } } for (int i = 0; i < n; i++) { int l=um[a[i].first],r=um[a[i].second]; int lg=log2(r-l+1); mn[i]=min(mn_table[l][lg],mn_table[r-(1<<lg)+1][lg]); } for (int j = 1; j < LOG; j++) { for (int i = 0; i < n; i++) { lift[i][j]=lift[lift[i][j-1].second][j-1]; } } vector<pair<int,int>> qrs(q); for (int i = 0; i < q; i++) cin >> qrs[i].first >> qrs[i].second; for (int i = 0; i < q; i++) { int s=qrs[i].first-1,e=qrs[i].second-1; if(s==e){ cout << 0 << "\n"; continue; } if(a[s].second>a[e].second){ cout << "impossible\n"; continue; } else if(a[s].second>=a[e].first){ cout << 1 << "\n"; continue; } int sm=0; for (int j = LOG-1; j >= 0; j--) { if(lift[s][j].first<a[e].first){ sm+=(1<<j); s=lift[s][j].second; } } if(mn[e]>a[s].second){ cout << "impossible\n"; continue; } sm+=2; cout << sm << "\n"; } return 0; }
#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...