Submission #1222880

#TimeUsernameProblemLanguageResultExecution timeMemory
1222880minhpkTwo Antennas (JOI19_antennas)C++20
22 / 100
351 ms72192 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXA = 1000005; const int MAXST = MAXA * 4; const long long bruh = (long long)1e16; int a, c; struct node { int h, l, r; } z[MAXA]; vector<int> sta[MAXA], fin[MAXA]; struct query { int l, r, id; } q[MAXA]; int res[MAXA]; bool cmp(query A, query B) { return A.r < B.r; } long long f[MAXST], f1[MAXST], lazy[MAXST]; void push(int id) { if (lazy[id] != -bruh) { f1[id] = max(f1[id], lazy[id] - f[id]); int lc = id << 1, rc = lc | 1; lazy[lc] = max(lazy[lc], lazy[id]); lazy[rc] = max(lazy[rc], lazy[id]); lazy[id] = -bruh; } } void build(int id, int l, int r) { lazy[id] = -bruh; f[id] = bruh; f1[id] = -bruh; if (l == r) return; int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); } void update(int id, int l, int r, int pos, int val) { push(id); if (l == r) { f[id] = val; return; } int mid = (l + r) >> 1; if (pos <= mid) { push(id << 1 | 1); update(id << 1, l, mid, pos, val); } else { push(id << 1); update(id << 1 | 1, mid + 1, r, pos, val); } f[id] = min(f[id << 1], f[id << 1 | 1]); f1[id] = max(f1[id << 1], f1[id << 1 | 1]); } void update1(int id, int l, int r, int x, int y, int val) { push(id); if (y < l || r < x) return; if (x <= l && r <= y) { lazy[id] = max(lazy[id], val); push(id); return; } int mid = (l + r) >> 1; update1(id << 1, l, mid, x, y, val); update1(id << 1 | 1, mid + 1, r, x, y, val); f[id] = min(f[id << 1], f[id << 1 | 1]); f1[id] = max(f1[id << 1], f1[id << 1 | 1]); } int get(int id, int l, int r, int x, int y) { push(id); if (y < l || r < x) return -bruh; if (x <= l && r <= y) return f1[id]; int mid = (l + r) >> 1; return max( get(id << 1, l, mid, x, y), get(id << 1 | 1, mid + 1, r, x, y) ); } void check() { build(1, 1, a); int cnt = 0; for (int i = 1; i <= c; i++) { int L = q[i].l, R = q[i].r, idx = q[i].id; while (cnt < R) { cnt++; for (int p : sta[cnt]) { update(1, 1, a, p, z[p].h); } for (int p : fin[cnt]) { update(1, 1, a, p, 2 * bruh); } int lo = max(1LL, cnt - z[cnt].r); int hi = max(1LL, cnt - z[cnt].l); if (lo <= hi) update1(1, 1, a, lo, hi, z[cnt].h); } res[idx] = max(res[idx], get(1, 1, a, L, R)); } } signed main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> a; for (int i = 1; i <= a; i++) { cin >> z[i].h >> z[i].l >> z[i].r; if (i + z[i].l <= a) sta[i + z[i].l].push_back(i); if (i + z[i].r + 1 <= a) fin[i + z[i].r + 1].push_back(i); } cin >> c; for (int i = 1; i <= c; i++) { cin >> q[i].l >> q[i].r; q[i].id = i; } sort(q + 1, q + 1 + c, cmp); for (int i = 1; i <= c; i++) res[i] = -1; check(); for (int i = 1; i <= a; i++) { z[i].h = bruh - z[i].h; sta[i].clear(); fin[i].clear(); } for (int i = a + 1; i < MAXA; ++i) { sta[i].clear(); fin[i].clear(); } for (int i = 1; i <= a; i++) { if (i + z[i].l <= a) sta[i + z[i].l].push_back(i); if (i + z[i].r + 1 <= a) fin[i + z[i].r + 1].push_back(i); } check(); for (int i = 1; i <= c; i++) { cout << res[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...