Submission #849760

#TimeUsernameProblemLanguageResultExecution timeMemory
849760qthang2k11Railway Trip 2 (JOI22_ho_t4)C++17
100 / 100
1302 ms129100 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5, lg = __lg(N) + 1; int n, k, m, q; struct Node { int l, r; Node(int l = N, int r = 0): l(l), r(r) {} Node operator + (const Node &other) const { return Node(min(l, other.l), max(r, other.r)); } Node& operator += (const Node &other) { l = min(l, other.l); r = max(r, other.r); return (*this); } }; struct SegmentTree { Node IT[N << 2], LZ[N << 2]; SegmentTree() = default; void apply(int id, const Node &val) { IT[id] += val; LZ[id] += val; } void push(int id) { Node &cur = LZ[id]; if (cur.l == N && cur.r == 0) return; apply(id << 1, cur); apply(id << 1 | 1, cur); cur = Node(); } void update(int x, int y, const Node &val, int id, int l, int r) { if (l > y || r < x) return; if (x <= l && r <= y) return apply(id, val); push(id); int mid = (l + r) / 2; update(x, y, val, id << 1, l, mid); update(x, y, val, id << 1 | 1, mid + 1, r); IT[id] = IT[id << 1] + IT[id << 1 | 1]; } Node get(int x, int y, int id, int l, int r) { if (l > y || r < x) return Node(); if (x <= l && r <= y) return IT[id]; push(id); int mid = (l + r) / 2; return get(x, y, id << 1, l, mid) + get(x, y, id << 1 | 1, mid + 1, r); } inline void update(int x, int y, const Node &val) { update(x, y, val, 1, 1, n); } inline Node get(int x, int y) { return get(x, y, 1, 1, n); } } IT[lg + 3]; int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> k >> m; for (int i = 1; i <= n; i++) IT[0].update(i, i, Node(i, i)); for (int i = 1; i <= m; i++) { int l, r; cin >> l >> r; if (l <= r) { int p = min(l + k - 1, r); IT[0].update(l, p, Node(N, r)); } else { int p = max(l - k + 1, r); IT[0].update(p, l, Node(r, 0)); } } for (int k = 1; k <= lg; k++) { for (int i = 1; i <= n; i++) { const auto &S = IT[k - 1].get(i, i); IT[k].update(i, i, IT[k - 1].get(S.l, S.r)); } } cin >> q; while (q--) { int s, t, ans = 0; cin >> s >> t; if (s == t) { cout << "0\n"; continue; } Node now(s, s); for (int k = lg; k >= 0; k--) { Node cur = IT[k].get(now.l, now.r); if (cur.l <= t && t <= cur.r) continue; ans += (1 << k); now = cur; } now = IT[0].get(now.l, now.r); if (now.l <= t && t <= now.r) cout << ans + 1; else cout << -1; cout << '\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...