Submission #1276222

#TimeUsernameProblemLanguageResultExecution timeMemory
1276222mdobricEvent Hopping (BOI22_events)C++20
0 / 100
193 ms31780 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 100005, off = 262144; int n, q, a[maxn], b[maxn], go[maxn][17]; set <int> s; set <int> ::iterator it; map <int, int> novi; pair <int, int> T[off * 2 + 5]; pair <int, int> query (int x, int y, int pos, int low, int high){ if (low >= x and high <= y) return T[pos]; if (low > y or high < x) return {maxn * 2, -1}; int mid = (low + high) / 2; return min(query(x, y, pos * 2, low, mid), query(x, y, pos * 2 + 1, mid + 1, high)); } int idi (int x, int p){ if (go[x][p] != -1) return go[x][p]; int pola = idi(x, p - 1); return go[x][p] = idi(pola, p - 1); } int solve (int x, int y){ if (x == y) return 0; if (b[x] > b[y]) return -1; if (b[x] >= a[y] and b[x] <= b[y]) return 1; //cout << "solve " << x << " " << y << endl; int ans = 0; for (int i = 16; i >= 0; i--){ int noviy = idi(y, i); if (a[noviy] > b[x]) y = noviy, ans += (1 << i); } y = go[y][0]; ans+=2; if (b[x] >= a[y] and b[x] <= b[y]) return ans; else return -1; } int main (void){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> q; for (int i = 0; i < n; i++){ cin >> a[i] >> b[i]; s.insert(a[i]); s.insert(b[i]); } for (int i = off; i < off * 2; i++) T[i].first = maxn * 2, T[i].second = -1; memset(go, -1, sizeof go); int br = 0; for (it = s.begin(); it != s.end(); it++) novi[*it] = br, br++; for (int i = 0; i < n; i++){ a[i] = novi[a[i]]; b[i] = novi[b[i]]; if (a[i] < T[off + b[i]].first){ T[off + b[i]].first = a[i]; T[off + b[i]].second = i; } } for (int i = off - 1; i >= 1; i--){ if (T[i * 2].first < T[i * 2 + 1].first) T[i] = T[i * 2]; else T[i] = T[i * 2 + 1]; } for (int i = 0; i < n; i++){ pair <int, int> x = query(a[i], b[i], 1, 0, off - 1); if (x.second != -1 and a[x.second] < a[i]) go[i][0] = x.second; else go[i][0] = i; //cout << i << " " << go[i][0] << endl; } for (int i = 0; i < q; i++){ int x, y; cin >> x >> y; x--; y--; int ans = solve(x, y); if (ans == -1) cout << "IMPOSSIBLE" << "\n"; else cout << ans << "\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...