Submission #1170354

#TimeUsernameProblemLanguageResultExecution timeMemory
1170354M_W_13Two Antennas (JOI19_antennas)C++20
100 / 100
473 ms37364 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) #define st first #define nd second #define pb push_back const int MAXN = 1 << 18; const ll INF = 1e17; ll maks[2 * MAXN][2]; ll wyn[2 * MAXN][2]; ll kopnij[2 * MAXN][2]; void kopnij_w_dol(int v, int c) { kopnij[2 * v][c] = max(kopnij[2 * v][c], kopnij[v][c]); kopnij[2 * v + 1][c] = max(kopnij[2 * v + 1][c], kopnij[v][c]); wyn[2 * v][c] = max(wyn[2 * v][c], kopnij[2 * v][c] + maks[2 * v][c]); wyn[2 * v + 1][c] = max(wyn[2 * v + 1][c], kopnij[2 * v + 1][c] + maks[2 * v + 1][c]); kopnij[v][c] = -INF; } void upd(int c, int v, int l, int r, int p, int k, ll x) { if (p <= l && r <= k) { kopnij[v][c] = max(kopnij[v][c], x); wyn[v][c] = max(wyn[v][c], maks[v][c] + x); } else if (p > r || l > k) { } else { kopnij_w_dol(v, c); int sr = (l + r)/2; upd(c, 2 * v, l, sr, p, k, x); upd(c, 2 * v + 1, sr + 1, r, p, k, x); wyn[v][c] = max(wyn[v][c], max(wyn[2 * v][c], wyn[2 * v + 1][c])); } } void upd2(int c, int v, int l, int r, int p, int k, ll x) { if (p <= l && r <= k) { maks[v][c] = x; kopnij[v][c] = -INF; } else if (p > r || l > k) { } else { kopnij_w_dol(v, c); int sr = (l + r)/2; upd2(c, 2 * v, l, sr, p, k, x); upd2(c, 2 * v + 1, sr + 1, r, p, k, x); maks[v][c] = max(maks[2 * v][c], maks[2 * v + 1][c]); wyn[v][c] = max(wyn[v][c], max(wyn[2 * v][c], wyn[2 * v + 1][c])); } } ll query(int c, int v, int l, int r, int p, int k) { if (p <= l && r <= k) { return wyn[v][c]; } else if (p > r || l > k) { return -1; } else { kopnij_w_dol(v, c); int sr = (l + r)/2; return max(query(c, 2 * v, l, sr, p, k), query(c, 2 * v + 1, sr + 1, r, p, k)); } } struct ant { ll h; int a, b; }; ant T[MAXN]; struct ask { int l, r; int nr; }; bool por(ask a, ask b) { return a.r < b.r; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); rep(i, 2 * MAXN) { rep(c, 2) { kopnij[i][c] = -INF; wyn[i][c] = -INF; maks[i][c] = -INF; } } int n; cin >> n; rep(i, n) { cin >> T[i].h >> T[i].a >> T[i].b; } int q; cin >> q; ask pyt[q]; ll odp[q]; rep(i, q) { odp[i] = -1; cin >> pyt[i].l >> pyt[i].r; pyt[i].l--; pyt[i].r--; pyt[i].nr = i; } sort(pyt, pyt + q, por); vector<pair<int, int>> zmiany; bool czyjest[n]; rep(i, n) { czyjest[i] = false; zmiany.pb({i + T[i].a, i}); zmiany.pb({i + T[i].b + 1, i}); } sort(zmiany.begin(), zmiany.end()); int it = 0; int sz = zmiany.size(); int it2 = 0; rep(i, n) { while (it < sz && zmiany[it].st <= i) { int v = zmiany[it].nd; if (!czyjest[v]) { upd2(0, 1, 0, MAXN - 1, v, v, -T[v].h); upd2(1, 1, 0, MAXN - 1, v, v, T[v].h); czyjest[v] = true; } else { upd2(0, 1, 0, MAXN - 1, v, v, -INF); upd2(1, 1, 0, MAXN - 1, v, v, -INF); czyjest[v] = false; } it++; } int l = i - T[i].b; int r = i - T[i].a; if (r >= 0) { l = max(0, l); upd(0, 1, 0, MAXN - 1, l, r, T[i].h); upd(1, 1, 0, MAXN - 1, l, r, -T[i].h); } // cout << maks[1][0] << " " << maks[1][1] << '\n'; // cout << wyn[1][0] << " " << wyn[1][1] << '\n'; // cout << "i = " << i << " query = " << query(0, 1, 0, MAXN - 1, 0, i) << " " << query(1, 1, 0, MAXN - 1, 0, i) << '\n'; while (it2 < q && pyt[it2].r <= i) { odp[pyt[it2].nr] = max(odp[pyt[it2].nr], max(query(0, 1, 0, MAXN - 1, pyt[it2].l, pyt[it2].r), query(1, 1, 0, MAXN - 1, pyt[it2].l, pyt[it2].r))); it2++; } } rep(i, q) { cout << odp[i] << " "; } cout << '\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...