Submission #1176270

#TimeUsernameProblemLanguageResultExecution timeMemory
1176270avighnaTwo Antennas (JOI19_antennas)C++20
0 / 100
232 ms22060 KiB
#include <bits/stdc++.h> template <typename T> struct SegmentTree { std::vector<T> seg; int n; std::function<T(T, T)> f; T idt; SegmentTree(int n, const std::function<T(T, T)> &f, T idt) : n(n), f(f), idt(idt) { seg.resize(2 * n, idt); } void set(int idx, T x) { for (seg[idx += n] = x; idx > 1; idx /= 2) { seg[idx / 2] = f(seg[idx], seg[idx ^ 1]); } } T query(int a, int b) { T ans = idt; for (a += n, b += n + 1; a < b; a /= 2, b /= 2) { if (a & 1) { ans = f(ans, seg[a++]); } if (b & 1) { ans = f(ans, seg[--b]); } } return ans; } }; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; std::vector<int> h(n), a(n), b(n); for (int i = 0; i < n; ++i) { std::cin >> h[i] >> a[i] >> b[i]; } auto comm = [&](int i, int j) { return (i + a[i] <= j and j <= i + b[i]) or (i - b[i] <= j and j <= i - a[i]); }; struct Node { int min, max; }; SegmentTree<Node> st( n, [&](Node a, Node b) { return Node({std::min(a.min, b.min), std::max(a.max, b.max)}); }, Node({-1, int(1e9) + 1})); std::set<std::pair<int, int>> st_l, st_r; std::vector<bool> sat_l(n), sat_r(n); auto check = [&](int i) { if (sat_l[i] and sat_r[i]) { st.set(i, Node({h[i], h[i]})); } else { st.set(i, Node({-1, int(1e9) + 1})); } }; for (int i = 0; i < n; ++i) { st_l.insert({i - b[i], i}); st_r.insert({i - a[i], i}); sat_l[i] = i - b[i] <= 0; sat_r[i] = 0 <= i - a[i]; check(i); } int q; std::cin >> q; while (q--) { int l, r; std::cin >> l >> r; --l, --r; int ans = -1; for (int i = l; i < r; ++i) { while (!st_l.empty() and st_l.begin()->first <= i) { sat_l[st_l.begin()->second] = true; check(st_l.begin()->second); st_l.erase(st_l.begin()); } while (!st_r.empty() and i > st_r.begin()->first) { sat_r[st_r.begin()->second] = false; check(st_r.begin()->second); st_r.erase(st_r.begin()); } int q_l = std::min(i + a[i], n - 1); int q_r = std::min(i + b[i], n - 1); Node q = st.query(q_l, q_r); if (q.min == -1) { continue; } ans = std::max(ans, std::max(std::abs(h[i] - q.min), std::abs(h[i] - q.max))); } std::cout << ans << '\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...