Submission #780876

#TimeUsernameProblemLanguageResultExecution timeMemory
780876TeaTimeTwo Antennas (JOI19_antennas)C++17
100 / 100
714 ms88040 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; typedef long double ld; #define fastInp cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); const ll SZ = 200'100, INF = 2'000'000'000; struct tow { ll h, a, b; }; struct qs{ ll l, r, ind; }; vector<tow> vec; vector<qs> queries[SZ]; ll n, q; ll pushmx[SZ * 8], pushmn[SZ * 8], opt[SZ * 4], mx[SZ * 4], mn[SZ * 4]; void push(int v) { opt[v] = max(opt[v], pushmx[v] - mn[v]); opt[v] = max(opt[v], mx[v] - pushmn[v]); pushmx[v * 2 + 1] = max(pushmx[v * 2 + 1], pushmx[v]); pushmx[v * 2 + 2] = max(pushmx[v * 2 + 2], pushmx[v]); pushmn[v * 2 + 1] = min(pushmn[v * 2 + 1], pushmn[v]); pushmn[v * 2 + 2] = min(pushmn[v * 2 + 2], pushmn[v]); pushmx[v] = -INF; pushmn[v] = INF; } void toggle(int v, int l, int r, int pos) { push(v); if (l == r - 1) { if (mx[v] == -INF) { mx[v] = mn[v] = vec[l].h; } else { mx[v] = -INF; mn[v] = INF; } } else { push(v * 2 + 1); push(v * 2 + 2); int mid = (l + r) / 2; if (pos < mid) { toggle(v * 2 + 1, l, mid, pos); } else { toggle(v * 2 + 2, mid, r, pos); } mx[v] = max(mx[v * 2 + 1], mx[v * 2 + 2]); mn[v] = min(mn[v * 2 + 1], mn[v * 2 + 2]); opt[v] = max(opt[v * 2 + 1], opt[v * 2 + 2]); } } ll ask(int v, int l, int r, int askl, int askr) { push(v); if (l >= askr || r <= askl) return -1; if (askl <= l && r <= askr) { return opt[v]; } int mid = (l + r) / 2; return max(ask(v * 2 + 1, l, mid, askl, askr), ask(v * 2 + 2, mid, r, askl, askr)); } void upd(int v, int l, int r, int askl, int askr, ll val) { push(v); if (l >= askr || r <= askl) return; if (askl <= l && r <= askr) { pushmn[v] = min(pushmn[v], val); pushmx[v] = max(pushmx[v], val); push(v); return; } int mid = (l + r) / 2; upd(v * 2 + 1, l, mid, askl, askr, val); upd(v * 2 + 2, mid, r, askl, askr, val); push(v * 2 + 1); push(v * 2 + 2); mx[v] = max(mx[v * 2 + 1], mx[v * 2 + 2]); mn[v] = min(mn[v * 2 + 1], mn[v * 2 + 2]); opt[v] = max(opt[v * 2 + 1], opt[v * 2 + 2]); } vector<ll> togler[SZ * 2 + 100]; int main() { fastInp; cin >> n; vec.resize(n); for (auto &c : vec) cin >> c.h >> c.a >> c.b; cin >> q; for (int i = 0; i < q; i++) { ll l, r; cin >> l >> r; l--; r--; queries[r].push_back({l, r, i}); } for (int i = 0; i < SZ * 8; i++) { pushmx[i] = -INF; pushmn[i] = INF; } for (int i = 0; i < SZ * 4; i++) { opt[i] = -1; mx[i] = -INF; mn[i] = INF; } vector<ll> ans(q); for (int i = 0; i < n; i++) { for (auto c : togler[i]) { toggle(0, 0, n, c); } ll l = i - vec[i].b, r = i - vec[i].a; l = max(l, 0ll); upd(0, 0, n, l, r + 1, vec[i].h); for (auto c : queries[i]) { ans[c.ind] = ask(0, 0, n, c.l, c.r + 1); } togler[i + vec[i].a].push_back(i); togler[i + vec[i].b + 1].push_back(i); } for (auto c : ans) cout << c << "\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...