Submission #1253412

#TimeUsernameProblemLanguageResultExecution timeMemory
1253412ankiteTriple Jump (JOI19_jumps)C++20
0 / 100
23 ms20552 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct Node { ll best1, best2, best3; // best1 = max A[i] // best2 = max A[i]+A[j], i<j // best3 = max A[x]+A[y]+A[z], x<y<z, with (y-x) <= (z-y) }; vector<Node> seg; int N, Q; vector<ll> A; Node merge_node(const Node &L, const Node &R){ Node U; U.best1 = max(L.best1, R.best1); U.best2 = max({ L.best2, R.best2, L.best1 + R.best1 }); U.best3 = max({ L.best3, R.best3, L.best2 + R.best1, L.best1 + R.best2 }); return U; } void build(int idx, int l, int r){ if(l==r){ seg[idx] = { A[l], LLONG_MIN/2, LLONG_MIN/2 }; return; } int m = (l+r)>>1; build(idx<<1, l, m); build(idx<<1|1, m+1, r); seg[idx] = merge_node(seg[idx<<1], seg[idx<<1|1]); } Node query(int idx, int l, int r, int ql, int qr){ if(ql<=l && r<=qr) return seg[idx]; int m = (l+r)>>1; if(qr<=m) return query(idx<<1, l, m, ql, qr); if(ql> m) return query(idx<<1|1, m+1, r, ql, qr); Node L = query(idx<<1, l, m, ql, qr); Node R = query(idx<<1|1, m+1, r, ql, qr); return merge_node(L, R); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N; A.resize(N+1); for(int i=1;i<=N;i++) cin >> A[i]; seg.resize(4*(N+1)); build(1,1,N); cin >> Q; while(Q--){ int l, r; cin >> l >> r; auto ans = query(1,1,N,l,r); // If there's no valid triple, best3 will be very negative. // You can define what to print in that case; here we print best3 as is. cout << ans.best3 << "\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...