Submission #1184106

#TimeUsernameProblemLanguageResultExecution timeMemory
1184106OI_AccountTwo Antennas (JOI19_antennas)C++20
0 / 100
259 ms33000 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 200'000; const ll INF = 1'000'000'000'000'000'000; int n, q; int a[N + 10], b[N + 10]; ll h[N + 10], res[N + 10]; ll maxH[4 * N + 10], ans[4 * N + 10], lazy[4 * N + 10]; vector<int> st[N + 10], en[N + 10]; vector<pair<int, int>> query[N + 10]; void readInput() { cin >> n; for (int i = 1; i <= n; i++) cin >> h[i] >> a[i] >> b[i]; cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; query[r].push_back({l, i}); } } void shift(int, int, int); ll get(int st, int en, int id = 1, int l = 1, int r = n + 1) { if (en <= l || r <= st) return -INF; if (st <= l && r <= en) return ans[id]; shift(id, l, r); int mid = (l + r) >> 1; return max(get(st, en, id << 1, l, mid), get(st, en, id << 1 | 1, mid, r)); } void updateAns(int st, int en, ll val, int id = 1, int l = 1, int r = n + 1) { if (en <= l || r <= st) return; if (st <= l && r <= en) { ans[id] = max(ans[id], maxH[id] + val); lazy[id] = max(lazy[id], val); return; } shift(id, l, r); int mid = (l + r) >> 1; updateAns(st, en, val, id << 1, l, mid); updateAns(st, en, val, id << 1 | 1, mid, r); ans[id] = max(ans[id << 1], ans[id << 1 | 1]); } void updateH(int idx, ll val, int id = 1, int l = 1, int r = n + 1) { if (idx < l || r <= idx) return; if (l + 1 == r) { maxH[id] = val; return; } shift(id, l, r); int mid = (l + r) >> 1; updateH(idx, val, id << 1, l, mid); updateH(idx, val, id << 1 | 1, mid, r); maxH[id] = max(maxH[id << 1], maxH[id << 1 | 1]); } void shift(int id, int l, int r) { if (lazy[id] == -INF) return; int mid = (l + r) >> 1; updateAns(l, r, lazy[id], id << 1, l, mid); updateAns(l, r, lazy[id], id << 1 | 1, mid, r); lazy[id] = -INF; } void build(int id = 1, int l = 1, int r = n + 1) { ans[id] = -1; maxH[id] = lazy[id] = -INF; if (l + 1 == r) return; int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid, r); } void calcStEn() { for (int i = 1; i <= n; i++) { int u = i + a[i], v = i + b[i]; if (u <= n) st[u].push_back(i); if (v <= n) en[u].push_back(i); } } void calcAns() { build(); for (int i = 1; i <= n; i++) { for (auto idx: st[i]) updateH(idx, h[idx]); int v = i - a[i], u = i - b[i]; if (1 <= v) { u = max(1, u); updateAns(u, v + 1, -h[i]); } for (auto [l, idx]: query[i]) res[idx] = max(res[ idx], get(l, i + 1)); for (auto idx: en[i]) updateH(idx, -INF); } } void solve() { for (int i = 1; i <= q; i++) res[i] = -1; calcAns(); for (int i = 1; i <= n; i++) h[i] = -h[i]; calcAns(); } void writeOutput() { for (int i = 1; i <= q; i++) cout << res[i] << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); readInput(); calcStEn(); solve(); writeOutput(); 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...