Submission #1299101

#TimeUsernameProblemLanguageResultExecution timeMemory
1299101nemkhoTwo Antennas (JOI19_antennas)C++20
0 / 100
168 ms42920 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pr pair <int, int> using namespace std; const int N = 2e5 + 5; const ll inf = 1e18; struct Seg { ll mmin, mmax, val; }; Seg st[N*4], lazy[N*4]; int n, h[N], L[N], R[N], q; ll ans[N]; vector <pr> event, query[N]; void inp() { cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i] >> L[i] >> R[i]; } for (int i = 1; i <= n; i++) { event.push_back({i + L[i], i}); event.push_back({i + R[i] + 1, -1}); } cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; query[r].push_back({l, i}); } } void push (int id) { if (lazy[id].mmin != 1e18) { st[id * 2].mmin = min(st[id * 2].mmin, lazy[id].mmin); st[id * 2].mmax = max(st[id * 2].mmax, lazy[id].mmax); st[id * 2].val = st[id * 2].mmax - st[id * 2].mmin; lazy[id * 2].mmin = min(lazy[id * 2].mmin, lazy[id].mmin); lazy[id * 2].mmax = max(lazy[id * 2].mmax, lazy[id].mmax); st[id * 2 + 1].mmin = min(st[id * 2 + 1].mmin, lazy[id].mmin); st[id * 2 + 1].mmax = max(st[id * 2 + 1].mmax, lazy[id].mmax); st[id * 2 + 1].val = st[id * 2 + 1].mmax - st[id * 2 + 1].mmin; lazy[id * 2 + 1].mmin = min(lazy[id * 2 + 1].mmin, lazy[id].mmin); lazy[id * 2 + 1].mmax = max(lazy[id * 2 + 1].mmax, lazy[id].mmax); lazy[id].mmin = 1e18; lazy[id].mmax = -1e18; } } Seg combine (Seg a, Seg b) { Seg tmp; tmp.mmin = min(a.mmin, b.mmin); tmp.mmax = max(a.mmax, b.mmax); tmp.val = max(a.val, b.val); return tmp; } void update (int id, int l, int r, int u, int v, ll val, bool t) { if (u > r || v < l) return; if (u <= l & v >= r) { if (val == -1) { st[id].mmin = 1e18; st[id].mmax = -1e18; st[id].val = -1; lazy[id].mmin = 1e18; lazy[id].mmax = -1e18; } else if (t) { //cout << st[id].mmin << " " << val << "\n"; st[id].val = max({st[id].mmax - val, val - st[id].mmin, st[id].val}); lazy[id].mmin = min(lazy[id].mmin, val); lazy[id].mmax = max(lazy[id].mmax, val); } else { st[id].mmin = min(st[id].mmin, val); st[id].mmax = max(st[id].mmax, val); //st[id].val = -1; // cout << u << " " << val << "\n"; } return; } int mid = (l + r) / 2; push(id); update(id * 2, l, mid, u, v, val, t); update(id * 2 + 1, mid + 1, r, u, v, val, t); st[id] = combine(st[id * 2], st[id * 2 + 1]); } ll get (int id, int l, int r, int u, int v) { //cout << st[id].val << "\n"; if (u > r || v < l) return -inf; if (u <= l && v >= r) return st[id].val; int mid = (l + r) / 2; push(id); return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); } void solve() { for (int i = 1; i < N*4; i++) { st[i].mmin = 1e18; st[i].mmax = -1e18; lazy[i].mmin = 1e18; lazy[i].mmax = -1e18; st[i].val = -1; } int j = 0; sort(event.begin(), event.end()); for (int i = 1; i <= n; i++) { while (j < event.size() && event[j].fi <= i) { if (event[j].se == -1) update(1, 1, n, event[j].se, event[j].se, -1, 0); else update(1, 1, n, event[j].se, event[j].se, h[event[j].se], 0); j++; } if (i - L[i] >= 1) { // cout << i << " " << i - R[i] << " " << i - L[i] << "\n"; update(1, 1, n, max(1, i - R[i]), max(1, i - L[i]), h[i], 1); } for (pr j : query[i]) { ll tmp = get(1, 1, n, j.fi, i); // cout << tmp.mmax << " " << tmp.mmin << "\n"; ans[j.se] = tmp; } } for (int i = 1; i <= q; i++) cout << ans[i] << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); inp(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...