Submission #1166922

#TimeUsernameProblemLanguageResultExecution timeMemory
1166922fryingducEvent Hopping (BOI22_events)C++20
100 / 100
161 ms20796 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]; int up[maxn][LG + 1]; pair<int, int> tree[maxn << 2]; int lim; void update(int pos, pair<int, int> val, int ind = 1, int l = 1, int r = lim) { if (l == r) { tree[ind] = min(tree[ind], val); return; } int mid = (l + r) >> 1; if (pos <= mid) update(pos, val, ind << 1, l, mid); else update(pos, val, ind << 1 | 1, mid + 1, r); tree[ind] = min(tree[ind << 1], tree[ind << 1 | 1]); } pair<int, int> get(int x, int y, int ind = 1, int l = 1, int r = lim) { if (l > y || r < x) return make_pair(1e9, 1e9); if (x <= l and r <= y) { return tree[ind]; } int mid = (l + r) >> 1; return min(get(x, y, ind << 1, l, mid), get(x, y, ind << 1 | 1, mid + 1, r)); } void solve() { cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> sl[i] >> sr[i]; } vector<int> cprs; for (int i = 1; i <= n; ++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()); lim = (int)cprs.size(); memset(tree, 0x3f, sizeof(tree)); for (int i = 1; i <= n; ++i) { int l = lower_bound(cprs.begin(), cprs.end(), sl[i]) - cprs.begin() + 1; int r = lower_bound(cprs.begin(), cprs.end(), sr[i]) - cprs.begin() + 1; update(r, make_pair(sl[i], i)); } for (int i = 1; i <= n; ++i) { int l = lower_bound(cprs.begin(), cprs.end(), sl[i]) - cprs.begin() + 1; int r = lower_bound(cprs.begin(), cprs.end(), sr[i]) - cprs.begin() + 1; up[i][0] = get(l, r).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; } if (sr[s] <= sr[e] and sr[s] >= sl[e]) { cout << 1 << '\n'; continue; } int ans = 0; int cur = e; for (int i = LG; i >= 0; --i) { if (up[cur][i] and sl[up[cur][i]] > sr[s]) { ans ^= (1 << i); cur = up[cur][i]; } } cur = up[cur][0]; ++ans; if (sl[cur] > sr[s] || sr[cur] < sr[s]) { cout << "impossible\n"; continue; } cout << ans + (sr[s] >= sl[cur]) << '\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...