제출 #471990

#제출 시각아이디문제언어결과실행 시간메모리
4719901binTwo Antennas (JOI19_antennas)C++14
100 / 100
1183 ms59588 KiB
#include <bits/stdc++.h> using namespace std; #define all(v) v.begin(), v.end() typedef long long ll; const int NMAX = 2e5 + 5; const ll inf = 1e18; ll n, h[NMAX], a[NMAX], b[NMAX], Q, ans[NMAX], l[NMAX], r[NMAX], base = 1, s, e; vector<ll> p[NMAX], m[NMAX]; vector<pair<ll, ll>> query[NMAX]; vector<ll> c, d, lazy; void init() { for (int i = 1; i <= n + 1; i++) { p[i].clear(); m[i].clear(); } for (int i = 1; i < base * 2; i++) c[i] = inf, d[i] = -inf, lazy[i] = -1; return; } void upd_lazy(ll idx) { if (lazy[idx] == -1) return; d[idx] = max(d[idx], lazy[idx] - c[idx]); if (idx < base) { lazy[idx * 2] = max(lazy[idx * 2], lazy[idx]); lazy[idx * 2 + 1] = max(lazy[idx * 2 + 1], lazy[idx]); } lazy[idx] = -1; return; } void updc(ll idx, ll nl, ll nr, ll k, ll v) { upd_lazy(idx); if (nl == nr) { c[idx] = v; return; } ll mid = (nl + nr) / 2; if (k <= mid) updc(idx * 2, nl, mid, k, v); else updc(idx * 2 + 1, mid + 1, nr, k, v); c[idx] = min(c[idx * 2], c[idx * 2 + 1]); return; } ll minc(ll l, ll r) { ll ret = inf; l += base; r += base; while (l <= r) { if (l & 1) ret = min(ret, c[l++]); if (!(r & 1)) ret = min(ret, c[r--]); l /= 2; r /= 2; } return ret; } void updd(ll idx, ll nl, ll nr, ll l, ll r, ll v) { upd_lazy(idx); if (nr < l || nl > r) return; if (nl >= l && nr <= r) { d[idx] = max(d[idx], v - c[idx]); if (nl != nr) { lazy[idx * 2] = max(lazy[idx * 2], v); lazy[idx * 2 + 1] = max(lazy[idx * 2 + 1], v); } return; } ll mid = (nl + nr) / 2; updd(idx * 2, nl, mid, l, r, v); updd(idx * 2 + 1, mid + 1, nr, l, r, v); d[idx] = max(d[idx * 2], d[idx * 2 + 1]); return; } ll mxd(ll idx, ll nl, ll nr, ll l, ll r) { upd_lazy(idx); if (nr < l || nl > r) return -inf; if (nl >= l && nr <= r) return d[idx]; ll mid = (nl + nr) / 2; return max(mxd(idx * 2, nl, mid, l, r), mxd(idx * 2 + 1, mid + 1, nr, l, r)); } void go() { init(); for (int i = 1; i <= n; i++) { s = i + a[i]; e = min(i + b[i] + 1, n + 1); if (s <= n) { p[s].emplace_back(i); m[e].emplace_back(i); } for (ll x : p[i]) updc(1, 0, base - 1, x, h[x]); for (ll x : m[i]) updc(1, 0, base - 1, x, inf); if (i > 1) { s = max(i - b[i], 1LL); e = i - a[i]; if (e >= 1) updd(1, 0, base - 1, s, e, h[i]); for (auto& q : query[i]) ans[q.second] = max(ans[q.second], mxd(1, 0, base - 1, q.first, i)); } } return; } int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; while (base < n + 1) base *= 2; c.resize(base * 2); d.resize(base * 2); lazy.resize(base * 2); for (int i = 1; i <= n; i++) cin >> h[i] >> a[i] >> b[i]; cin >> Q; for (int i = 0; i < Q; i++) { cin >> l[i] >> r[i]; query[r[i]].emplace_back(l[i], i); ans[i] = -1; } go(); reverse(h + 1, h + n + 1); reverse(a + 1, a + n + 1); reverse(b + 1, b + n + 1); for (int i = 1; i <= n; i++) query[i].clear(); for (int i = 0; i < Q; i++) { l[i] = n + 1 - l[i]; r[i] = n + 1 - r[i]; swap(l[i], r[i]); query[r[i]].emplace_back(l[i], i); } go(); for (int i = 0; i < Q; i++) { cout << ans[i] << '\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...