제출 #868530

#제출 시각아이디문제언어결과실행 시간메모리
868530Dec0DeddEvent Hopping (BOI22_events)C++14
0 / 100
61 ms21888 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int N = 1e5+10; const int K = 5; const int INF = 1e6+10; int up[K][N], d[K][N], s[N], lf[N], e[N], mx[N], n, q; vector<pii> v; vector<int> add[N], rm[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cin>>n>>q; for (int i=0; i<n; ++i) { cin>>s[i]>>e[i]; v.push_back({e[i], i}); } sort(v.begin(), v.end()); for (int i=0; i<n; ++i) { int j=lower_bound(v.begin(), v.end(), make_pair(s[v[i].second], -1))-v.begin(); lf[i]=j; add[lf[i]].push_back(v[i].second); rm[i+1].push_back(v[i].second); } multiset<pii> ms; for (int i=0; i<n; ++i) { for (auto u : add[i]) ms.insert({e[u], u}); for (auto u : rm[i]) ms.erase(ms.find({e[u], u})); mx[i]=ms.rbegin()->second; } for (int i=n-1; i>=0; --i) { up[0][i]=mx[i], d[0][i]=(mx[i] != i); for (int j=1; j<K; ++j) { up[j][i]=up[j-1][up[j-1][i]]; d[j][i]=d[j-1][i]+d[j-1][up[j-1][i]]; } } while (q--) { int l, r; cin>>l>>r; --l, --r; if (e[r] < e[l]) { cout<<"impossible\n"; continue; } int ans=0; for (int j=K-1; j>=0; --j) { if (up[j][l] <= r) ans+=d[j][l], l=up[j][l]; } if (l == r) ans+=0; else { if (s[r] <= e[l]) ++ans, l=r; else { cout<<"impossible\n"; continue; } } assert(l == r); 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...