Submission #1271673

#TimeUsernameProblemLanguageResultExecution timeMemory
1271673ac_quanTwo Antennas (JOI19_antennas)C++20
100 / 100
352 ms54524 KiB
#include <bits/stdc++.h> using namespace std; #define all(ac) ac.begin(),ac.end() #define task "tet" #define fi first #define se second #define pii pair<int,int> #define db long double #define int long long struct node { int mn, mx; node(int mn = 1e18, int mx = -1e18): mn(mn), mx(mx) {} bool operator == (const node o) {return o.mn == mn && o.mx == mx;} }; node dat(node a, node b) { return {min(a.mn, b.mn), max(a.mx, b.mx)}; } struct segtree { int n; vector <node> st, lz; vector <int> ans; segtree(int n): n(n), ans(4 * n + 1, -1), lz(4 * n + 1, node()), st(4 * n + 1, node()) {} void down(int id) { auto x = lz[id]; if(x == node()) return; lz[id << 1] = dat(lz[id << 1], x); lz[id << 1 | 1] = dat(lz[id << 1 | 1], x); ans[id << 1] = max(ans[id << 1], max(lz[id << 1].mx - st[id << 1].mn, st[id << 1].mx - lz[id << 1].mn)); ans[id << 1 | 1] = max({ans[id << 1 | 1], lz[id << 1 | 1].mx - st[id << 1 | 1].mn, st[id << 1 | 1].mx - lz[id << 1 | 1].mn}); lz[id] = node(); return; } void update_point(int id, int l, int r, int pos, int w) { if(l > pos || r < pos) return; if(l == r) { ans[id] = max({ans[id], lz[id].mx - st[id].mn, st[id].mx - lz[id].mn}); st[id] = {w, w}; if(w < 0) st[id] = node(); lz[id] = node(); return; } int mid = (l + r) >> 1; down(id); update_point(id << 1, l, mid, pos, w); update_point(id << 1 | 1, mid + 1, r, pos, w); st[id] = dat(st[id << 1], st[id << 1 | 1]); ans[id] = max(ans[id << 1], ans[id << 1 | 1]); return; } void update_range(int id, int l, int r, int u, int v, int w) { if(l > v || r < u) return; if(l >= u && r <= v) { lz[id] = dat(lz[id], {w, w}); ans[id] = max({ans[id], lz[id].mx - st[id].mn, st[id].mx - lz[id].mn}); return; } int mid = (l + r) >> 1; down(id); update_range(id << 1, l, mid, u, v, w); update_range(id << 1 | 1, mid + 1, r, u, v, w); ans[id] = max(ans[id << 1], ans[id << 1 | 1]); return; } int get(int id, int l, int r, int u, int v) { if(l > v || r < u) return -1; if(l >= u && r <= v) return ans[id]; int mid = (l + r) >> 1; down(id); return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } }; struct Event { int x, y, z; bool operator <(const Event o) {return y < o.y;} Event(int x = 0, int y = 0, int z = 0): x(x), y(y), z(z) {} }; int32_t main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int n; cin >> n; vector <Event> events[n + 1]; Event init[n + 1]; for(int i=1;i<=n;i++) { int h, l, r; cin >> h >> l >> r; if(i + l <= n) events[i + l].push_back({i, h, 1}); if(i + r + 1 <= n) events[i + r + 1].push_back({i, h, -1}); init[i] = {l, r, h}; } vector <Event> qr; int Q; cin >> Q; for(int i=1;i<=Q;i++) { int l, r; cin >> l >> r; qr.push_back({l, r, i}); } sort(all(qr)); segtree sg(n); int ans[Q + 1], pos = 1; for(auto e:qr) { while(pos <= e.y) { for(auto d:events[pos]) { sg.update_point(1, 1, n, d.x, d.y * d.z); } auto d = init[pos]; int l = pos - d.y, r = pos - d.x; if(r > 0) sg.update_range(1, 1, n, l, r, d.z); pos++; } ans[e.z] = sg.get(1, 1, n, e.x, e.y); } for(int i=1;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...