Submission #1166920

#TimeUsernameProblemLanguageResultExecution timeMemory
1166920fryingducEvent Hopping (BOI22_events)C++20
0 / 100
163 ms21460 KiB
#include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif const int maxn = 3e5 + 5; const int LG = 19; int n, q; int sl[maxn], sr[maxn]; int ord[maxn]; vector<int> ev[maxn]; int up[maxn][LG + 1]; void solve() { cin >> n >> q; vector<int> cprs; for (int i = 1; i <= n; ++i) { cin >> sl[i] >> sr[i]; cprs.push_back(sl[i]); cprs.push_back(sr[i]); cprs.push_back(sl[i] - 1); } sort(cprs.begin(), cprs.end()); cprs.erase(unique(cprs.begin(), cprs.end()), cprs.end()); for (int i = 1; i <= n; ++i) { int d = lower_bound(cprs.begin(), cprs.end(), sl[i] - 1) - cprs.begin() + 1; sl[i] = lower_bound(cprs.begin(), cprs.end(), sl[i]) - cprs.begin() + 1; sr[i] = lower_bound(cprs.begin(), cprs.end(), sr[i]) - cprs.begin() + 1; ev[sr[i]].push_back(i); if (d > 1) ev[d - 1].push_back(-i); } set<pair<int, int>> s; for (int i = (int)cprs.size(); i; --i) { if (ev[i].empty()) continue; sort(ev[i].begin(), ev[i].end()); for (auto j : ev[i]) { if (j < 0) { j = -j; s.erase(s.find(make_pair(sr[j], j))); } else { s.insert(make_pair(sr[j], j)); } } for (auto j : ev[i]) { if (j > 0) { if (!s.empty()) { auto it = s.rbegin(); if (j != it->second) { up[j][0] = it->second; } } } } } for (int j = 1; j <= LG; ++j) { for (int i = 1; i <= n; ++i) { up[i][j] = up[up[i][j - 1]][j - 1]; } } while (q--) { int s, e; cin >> s >> e; if (s == e) { cout << 0 << '\n'; continue; } if (sr[e] < sr[s]) { cout << "impossible\n"; continue; } int ans = 0; int cur = s; for (int i = LG; i >= 0; --i) { if (up[cur][i] and sr[up[cur][i]] < sr[e]) { ans ^= (1 << i); cur = up[cur][i]; } } if (sl[e] <= sr[cur]) cout << ans + 1 << '\n'; else { // debug(cur, up[cur][0]); cur = up[cur][0]; if (!cur || sr[cur] > sr[e]) cout << "impossible\n"; else cout << ans + 2 << '\n'; } } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); 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...