Submission #1038641

#TimeUsernameProblemLanguageResultExecution timeMemory
1038641phongTriple Jump (JOI19_jumps)C++17
100 / 100
424 ms88948 KiB
#include <bits/stdc++.h> using namespace std; typedef array<int, 3> Node; // 0/1/2: c/ab/abc const int maxn = 1 << 19; const int INF = 1e9; int n, q; int A[maxn]; vector<int> p[maxn]; vector<pair<int, int>> query[maxn]; struct segtree { Node T[maxn << 1]; Node upd(const Node&x, const Node& y) { return {max(x[0], y[0]), max(x[1], y[1]), max({x[1] + y[0], x[2], y[2]})}; } void init() { for (int i = maxn; i < maxn << 1; ++i) T[i] = {A[i - maxn], -INF, -INF}; for (int i = maxn - 1; i > 0; --i) T[i] = upd(T[2 * i], T[2 * i + 1]); } void update(int i, int v) { i += maxn; T[i][1] = max(T[i][1], v); T[i][2] = max(T[i][2], T[i][1] + T[i][0]); for (i >>= 1; i > 0; i >>= 1) { T[i] = upd(T[2 * i], T[2 * i + 1]); } } int get(int l, int r) { Node L = {-INF, -INF, -INF}; Node R = L; for (l += maxn, r += maxn; l < r; l >>= 1, r >>= 1) { if (l & 1) { L = upd(L, T[l]); l++; } if (r & 1) { r--; R = upd(T[r], R); } } return upd(L, R)[2]; } } seg; #define task "code" int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); // freopen(task".inp", "r", stdin); // freopen(task".ans", "w", stdout); cin >> n; stack<int> st; for (int i = 0; i < n; ++i) { cin >> A[i]; while (!st.empty()) { int j = st.top(), k = 2 * i - j; if (k < n) p[j].push_back(k); if (A[j] <= A[i]) st.pop(); else break; } st.push(i); } seg.init(); cin >> q; vector<int> answer(q, 0); for (int i = 0; i < q; ++i) { int l, r; cin >> l >> r; query[l - 1].emplace_back(r - 1, i); } for (int i = n - 1; i >= 0; --i) { for (int j : p[i]) { seg.update(j, A[i] + A[(i + j) / 2]); } for (auto it : query[i]) { answer[it.second] = seg.get(i, it.first + 1); } } for (int i = 0; i < q; ++i) cout << answer[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...