Submission #1261080

#TimeUsernameProblemLanguageResultExecution timeMemory
1261080QuocSenseiTriple Jump (JOI19_jumps)C++20
100 / 100
728 ms94120 KiB
#include <bits/stdc++.h> #define ll long long #define el cout << '\n' #define ii pair<ll, ll> #define fi first #define se second using namespace std; const int maxn = 5e5; int n, q; vector<int> g[maxn + 10]; vector<ii> query[maxn + 10]; vector<ll> stk; ll a[maxn + 10], ans[maxn + 10], st[4 * maxn + 10], tree[4 * maxn + 10], lazy[4 * maxn + 10]; void build(int id, int l, int r) { if (l == r) return tree[id] = a[l], void(); int m = l + r >> 1; build(id << 1, l, m); build(id << 1 | 1, m + 1, r); tree[id] = max(tree[id << 1], tree[id << 1 | 1]); } void push(int id) { for (int nxt_id = 2 * id; nxt_id <= 2 * id + 1; nxt_id++) { st[nxt_id] = max(st[nxt_id], tree[nxt_id] + lazy[id]); lazy[nxt_id] = max(lazy[nxt_id], lazy[id]); } } void update(int id, int l, int r, int u, int v, ll val) { if (r < u || l > v) return ; if (u <= l && r <= v) { st[id] = max(st[id], val + tree[id]); lazy[id] = max(lazy[id], val); return ; } int m = l + r >> 1; push(id); update(id << 1, l, m, u, v, val); update(id << 1 | 1, m + 1, r, u, v, val); st[id] = max(st[id << 1], st[id << 1 | 1]); } ll get(int id, int l, int r, int u, int v) { if (r < u || l > v) return 0; if (u <= l && r <= v) return st[id]; int m = l + r >> 1; push(id); return max(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v)); } void precompute() { build(1, 1, n); for (int i = n; i >= 1; i--) { while (stk.size() && a[i] > a[stk.back()]) { g[i].push_back(stk.back()); stk.pop_back(); } if (stk.size()) g[i].push_back(stk.back()); stk.push_back(i); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen("CHONQUA.INP", "r")) { freopen("CHONQUA.INP", "r", stdin); freopen("CHONQUA.OUT", "w", stdout); } cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; query[l].push_back({r, i}); } precompute(); for (int x = n; x >= 1; x--) { for (int y : g[x]) update(1, 1, n, 2 * y - x, n, a[x] + a[y]); for (ii pr : query[x]) ans[pr.se] = get(1, 1, n, x, pr.fi); } for (int i = 1; i <= q; i++) cout << ans[i], el; }

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:83:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |         freopen("CHONQUA.INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:84:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |         freopen("CHONQUA.OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...