Submission #1147050

#TimeUsernameProblemLanguageResultExecution timeMemory
1147050EvirirEvent Hopping (BOI22_events)C++20
0 / 100
129 ms31560 KiB
#include <bits/stdc++.h> #define int long long #define f first #define s second using namespace std; static constexpr long long INF = 1e18; struct segtree { vector<pair<int, int>> v; vector<pair<pair<int, int>, int>> a; void resz(int n, vector<pair<pair<int, int>, int>> w) { v.assign(4 * n, {INF, INF}); a = w; } void init(int k, int l, int r) { if (l > r) return; if (l == r) v[k].f = a[l].f.s, v[k].s = l + 1; else { int m = (l + r) / 2; init(2 * k, l, m); init(2 * k + 1, m + 1, r); v[k] = min(v[2 * k], v[2 * k + 1]); } } void upd(int k, int l, int r, int p, int x) { if (l > r) return; if (l == r) { v[k].f = x; return; } int m = (r + l) / 2; if (p <= m) upd(2 * k, l, m, p, x); else upd(2 * k + 1, m + 1, r, p, x); v[k] = min(v[2 * k], v[2 * k + 1]); } pair<int, int> prod(int k, int x, int y, int l, int r) { if (l == x && y == r) return v[k]; if (l > r) return {INF, INF}; int m = (x + y) / 2; return min(prod(2 * k, x, m, l, min(m, r)), prod(2 * k + 1, m + 1, y, max(l, m + 1), r)); } }; signed main() { cin.tie(0)->sync_with_stdio(0); int n, k; cin >> n >> k; vector<pair<pair<int, int>, int>> v(n); for (int i = 0; i < n; i++) { cin >> v[i].f.s >> v[i].f.f; v[i].s = i + 1; } sort(begin(v), end(v)); vector<int> w(n), z(n); for (int i = 0; i < n; i++) w[i] = v[i].f.f, z[v[i].s - 1] = i + 1; int c = log2(n) + 1; vector<vector<int>> t(n + 1, vector<int>(c)); t[0][0] = -1; segtree r; r.resz(n, v); r.init(1, 0, n - 1); for (int i = 1; i < n; i++) { r.upd(1, 0, n - 1, i, INF); // cout << lower_bound(begin(w),end(w),v[i].f.s)-begin(w) << ' ' << upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1 << ' ' << r.prod(1,0,n-1,lower_bound(begin(w),end(w),v[i].f.s)-begin(w),upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1).f << ' ' << r.prod(1,0,n-1,lower_bound(begin(w),end(w),v[i].f.s)-begin(w),upper_bound(begin(w),end(w),v[i].f.f)-begin(w)-1).s << '\n'; t[i + 1][0] = r.prod(1, 0, n - 1, lower_bound(begin(w), end(w), v[i].f.s) - begin(w), upper_bound(begin(w), end(w), v[i].f.f) - begin(w) - 1).s; if (lower_bound(begin(w), end(w), v[i].f.s) - begin(w) == upper_bound(begin(w), end(w), v[i].f.f) - begin(w) - 1) t[i + 1][0] = -1; r.upd(1, 0, n - 1, i, v[i].f.s); if (t[i + 1][0] == INF) t[i + 1][0] = -1; } for (int i = 1; i < c; i++) for (int j = 0; j <= n; j++) if (t[j][i - 1] == -1) t[j][i] = -1; else t[j][i] = t[t[j][i - 1]][i - 1]; // for (auto i : t) // { // for (auto j : i) // cout << j << ' '; // cout << '\n'; // } while (k--) { int x, y, a = 0; cin >> x >> y; x--, y--; int b = z[y]; if (x == y) { cout << "0\n"; continue; } for (int i = c - 1; i >= 0; i--) { if (t[b][i] >= z[x]) a += (1 << i), b = t[b][i]; if (b == -1) break; /*cout << a << ' ' << b << '\n';*/ } if (b == z[x]) cout << a << '\n'; else cout << "impossible\n"; // cout << z[x] << ' ' << z[y] << '\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...