제출 #1149419

#제출 시각아이디문제언어결과실행 시간메모리
1149419daoquanglinh2007Two Antennas (JOI19_antennas)C++20
100 / 100
579 ms38500 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair <int, int> #define fi first #define se second #define mp make_pair const int NM = 2e5, LIM = 1e9, inf = 1e18; int N, Q, H[NM+5], A[NM+5], B[NM+5]; pii st[4*NM+5]; int lazy[4*NM+5]; vector <int> arr[NM+5]; vector <pii> qry[NM+5]; int ans[NM+5]; pii merge(pii a, pii b){ pii c; c.fi = min(a.fi, b.fi); c.se = max(a.se, b.se); return c; } void build(int id, int l, int r){ lazy[id] = -inf; if (l == r){ st[id].fi = +inf; st[id].se = -inf; return; } int mid = (l+r)/2; build(2*id, l, mid); build(2*id+1, mid+1, r); st[id] = merge(st[2*id], st[2*id+1]); } void down(int id){ if (lazy[id] < 0) return; st[2*id].se = max(st[2*id].se, lazy[id]-st[2*id].fi); st[2*id+1].se = max(st[2*id+1].se, lazy[id]-st[2*id+1].fi); lazy[2*id] = max(lazy[2*id], lazy[id]); lazy[2*id+1] = max(lazy[2*id+1], lazy[id]); lazy[id] = -inf; } void update(int id, int l, int r, int i, int val){ if (i < l || i > r) return; if (l == r){ st[id].fi = val; return; } down(id); int mid = (l+r)/2; update(2*id, l, mid, i, val); update(2*id+1, mid+1, r, i, val); st[id] = merge(st[2*id], st[2*id+1]); } void maximize(int id, int l, int r, int u, int v, int val){ if (v < l || u > r) return; if (l >= u && r <= v){ st[id].se = max(st[id].se, val-st[id].fi); lazy[id] = max(lazy[id], val); return; } down(id); int mid = (l+r)/2; maximize(2*id, l, mid, u, v, val); maximize(2*id+1, mid+1, r, u, v, val); st[id] = merge(st[2*id], st[2*id+1]); } pii get(int id, int l, int r, int u, int v){ if (v < l || u > r) return mp(+inf, -inf); if (l >= u && r <= v) return st[id]; down(id); int mid = (l+r)/2; return merge(get(2*id, l, mid, u, v), get(2*id+1, mid+1, r, u, v)); } void solve(){ build(1, 1, N); for (int j = 1; j <= N; j++){ for (int i : arr[j]){ if (i > 0) update(1, 1, N, i, H[i]); else update(1, 1, N, -i, +inf); } if (j-A[j] > 0){ int l = max(j-B[j], 1LL), r = j-A[j]; maximize(1, 1, N, l, r, H[j]); } for (pii p : qry[j]){ int i = p.fi, id = p.se; ans[id] = max(ans[id], get(1, 1, N, i, j).se); } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N; for (int i = 1; i <= N; i++){ cin >> H[i] >> A[i] >> B[i]; if (i+A[i] <= N){ arr[i+A[i]].push_back(i); if (i+B[i]+1 <= N) arr[i+B[i]+1].push_back(-i); } } cin >> Q; for (int i = 1; i <= Q; i++){ int l, r; cin >> l >> r; qry[r].push_back(mp(l, i)); ans[i] = -inf; } solve(); for (int i = 1; i <= N; i++) H[i] = LIM+1-H[i]; solve(); for (int i = 1; i <= Q; i++) if (ans[i] < 0) cout << "-1\n"; else 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...