Submission #1222846

#TimeUsernameProblemLanguageResultExecution timeMemory
1222846minhpkTwo Antennas (JOI19_antennas)C++20
0 / 100
385 ms72188 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) update(id<<1, l, mid, pos, val); else 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 = 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...