제출 #789473

#제출 시각아이디문제언어결과실행 시간메모리
789473someoneTwo Antennas (JOI19_antennas)C++14
100 / 100
496 ms63140 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int M = 1 << 18, N = 2 * M, INF = 1e12 + 42; struct Node { int maxi = -1, maxVal = -INF, minVal = INF, maxTag = -INF, minTag = INF; }; Node node[N]; vector<int> req[M], upd[N]; int n, q, h[M], a[M], b[M], debReq[M], ans[M]; inline void applyOp(int i, int minTag, int maxTag) { node[i].minTag = min(node[i].minTag, minTag); node[i].maxTag = max(node[i].maxTag, maxTag); node[i].maxi = max(node[i].maxi, node[i].maxVal - minTag); node[i].maxi = max(node[i].maxi, maxTag - node[i].minVal); } void propage(int i) { applyOp(i*2, node[i].minTag, node[i].maxTag); applyOp(i*2+1, node[i].minTag, node[i].maxTag); node[i].minTag = INF, node[i].maxTag = -INF; } void update(int i, int deb, int fin, int l, int r, int newVal) { if(fin <= l || r <= deb) return; if(l <= deb && fin <= r) { applyOp(i, newVal, newVal); return; } propage(i); int mid = ((deb + fin) >> 1); update(i*2, deb, mid, l, r, newVal); update(i*2+1, mid, fin, l, r, newVal); node[i].maxi = max(node[i*2].maxi, node[i*2+1].maxi); } void setVal(int i, int deb, int fin, int pos, int minVal, int maxVal) { if(fin <= pos || pos < deb) return; if(fin - deb == 1) { node[i].minVal = minVal; node[i].maxVal = maxVal; return; } propage(i); int mid = ((deb + fin) >> 1); setVal(i*2, deb, mid, pos, minVal, maxVal); setVal(i*2+1, mid, fin, pos, minVal, maxVal); node[i].minVal = min(node[i*2].minVal, node[i*2+1].minVal); node[i].maxVal = max(node[i*2].maxVal, node[i*2+1].maxVal); } int getMax(int i, int deb, int fin, int l, int r) { if(fin <= l || r <= deb) return -1; if(l <= deb && fin <= r) return node[i].maxi; propage(i); int mid = ((deb + fin) >> 1), val = max(getMax(i*2, deb, mid, l, r), getMax(i*2+1, mid, fin, l, r)); return val; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0; i < n; i++) cin >> h[i] >> a[i] >> b[i]; cin >> q; for(int i = 0; i < q; i++) { int fin; cin >> debReq[i] >> fin; debReq[i]--, fin--; req[fin].push_back(i); } for(int i = 0; i < n; i++) { for(int j : upd[i]) { if(j >= 0) { setVal(1, 0, M, j, h[j], h[j]); } else { setVal(1, 0, M, -j-1, INF, -INF); } } update(1, 0, M, i - b[i], i - a[i] + 1, h[i]); for(int j : req[i]) ans[j] = getMax(1, 0, M, debReq[j], i); upd[i + a[i]].push_back(i); upd[i + b[i] + 1].push_back(-i-1); } for(int i = 0; i < q; i++) cout << ans[i] << '\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...