Submission #1257496

#TimeUsernameProblemLanguageResultExecution timeMemory
1257496tvgkTriple Jump (JOI19_jumps)C++20
100 / 100
778 ms91804 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 5e5 + 7; const ll inf = 1e18; int n, a[mxN], q; ll mx[mxN * 4], lazy[mxN * 4], tree[mxN * 4], ans[mxN]; vector<int> edge[mxN]; vector<ii> querry[mxN]; void Build(int j = 1, int l = 1, int r = n) { tree[j] = lazy[j] = -inf; if (l == r) { mx[j] = a[l]; return; } int mid = (l + r) / 2; Build(j * 2, l, mid); Build(j * 2 + 1, mid + 1, r); mx[j] = max(mx[j * 2], mx[j * 2 + 1]); } void Down(int j) { tree[j * 2] = max(tree[j * 2], mx[j * 2] + lazy[j]); lazy[j * 2] = max(lazy[j * 2], lazy[j]); tree[j * 2 + 1] = max(tree[j * 2 + 1], mx[j * 2 + 1] + lazy[j]); lazy[j * 2 + 1] = max(lazy[j * 2 + 1], lazy[j]); } void Upd(int vt, ll val, int j = 1, int l = 1, int r = n) { if (r < vt) return; if (vt <= l) { tree[j] = max(tree[j], mx[j] + val); lazy[j] = max(lazy[j], val); return; } Down(j); int mid = (l + r) / 2; Upd(vt, val, j * 2, l, mid); Upd(vt, val, j * 2 + 1, mid + 1, r); tree[j] = max(tree[j * 2], tree[j * 2 + 1]); } ll Get(int vt, int j = 1, int l = 1, int r = n) { if (vt < l) return 0; if (r <= vt) return tree[j]; Down(j); int mid = (l + r) / 2; ll res = max(Get(vt, j * 2, l, mid), Get(vt, j * 2 + 1, mid + 1, r)); tree[j] = max(tree[j * 2], tree[j * 2 + 1]); return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; stack<int> stk; for (int i = 1; i <= n; i++) { while (stk.size() && a[stk.top()] < a[i]) stk.pop(); if (stk.size()) edge[stk.top()].push_back(i); stk.push(i); } while (stk.size()) stk.pop(); for (int i = n; i >= 1; i--) { while (stk.size() && a[stk.top()] < a[i]) stk.pop(); if (stk.size()) edge[i].push_back(stk.top()); stk.push(i); } int q; cin >> q; for (int i = 1; i <= q; i++) { int u, v; cin >> u >> v; querry[u].push_back({i, v}); } Build(); for (int i = n; i >= 1; i--) { for (int j : edge[i]) Upd(i + (j - i) * 2, a[i] + a[j]); for (ii j : querry[i]) ans[j.fi] = Get(j.se); } for (int i = 1; i <= q; i++) cout << ans[i] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...