제출 #954439

#제출 시각아이디문제언어결과실행 시간메모리
954439TAhmed33Event Hopping (BOI22_events)C++98
25 / 100
1559 ms8428 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 25; const int B = 18; int dp[B][MAXN]; int n, q; pair <int, int> a[MAXN]; int jump (int a, int b) { for (int i = B - 1; i >= 0; i--) { if (b & (1 << i)) { a = dp[i][a]; } } return a; } int main () { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i].first >> a[i].second; } for (int i = 1; i <= n; i++) { dp[0][i] = i; for (int j = 1; j <= n; j++) { if (a[j].second >= a[i].first && a[j].second <= a[i].second) { if (a[j].first < a[dp[0][i]].first) dp[0][i] = j; } } } for (int i = 1; i < B; i++) { for (int j = 1; j <= n; j++) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; } } while (q--) { int x, y; cin >> x >> y; if (x == y) { cout << "0\n"; continue; } int l = 0, r = (1 << (B + 1)) - 1, ans = -1; while (l <= r) { int mid = (l + r) / 2; int z = jump(y, mid); if (z == 0) { r = mid - 1; continue; } if (a[z].first > a[x].second) { l = mid + 1; ans = mid; } else { r = mid - 1; } } y = jump(y, ans + 1); if (a[x].second <= a[y].second && a[x].second >= a[y].first) { cout << ans + 2 << '\n'; } else { cout << "impossible\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...