Submission #1159116

#TimeUsernameProblemLanguageResultExecution timeMemory
1159116dostsTriple Jump (JOI19_jumps)C++20
100 / 100
844 ms134196 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") using namespace std; #define int long long #define pii pair<int,int> #define ff first #define ss second #define sp << " " << #define all(cont) cont.begin(),cont.end() #define vi vector<int> const int inf = 2e16,N = 1e6+1,MOD = 998244353; struct Query { int r,id; }; struct ST { vi t,mx,lz,ans; void build(int node,int l,int r,const vi& a) { if (l == r) { t[node] = a[l]; return; } int m = (l+r) >> 1; build(2*node,l,m,a),build(2*node+1,m+1,r,a); t[node] = max(t[2*node],t[2*node+1]); } ST(int nn,const vi& a) { t.resize(4*nn+1); ans.resize(4*nn+1); mx.assign(4*nn+1,-inf); lz.assign(4*nn+1,-inf); build(1,1,nn,a); } void push(int node,bool leaf) { mx[node] = max(mx[node],lz[node]); ans[node] = max(ans[node],t[node]+mx[node]); if (!leaf) { lz[2*node] = max(lz[2*node],lz[node]); lz[2*node+1] = max(lz[2*node+1],lz[node]); } lz[node] = -inf; } void update(int node,int l,int r,int L,int R,int v) { push(node,l==r); if (l > R || r < L) return; if (l >= L && r <= R) { lz[node] = max(lz[node],v); push(node,l==r); return; } int m = (l+r) >> 1; update(2*node,l,m,L,R,v); update(2*node+1,m+1,r,L,R,v); ans[node] = max(ans[2*node],ans[2*node+1]); } int query(int node,int l,int r,int L,int R) { push(node,l==r); if (l > R || r < L) return 0; if (l >= L && r <= R) return ans[node]; int m = (l+r) >> 1; return max(query(2*node,l,m,L,R),query(2*node+1,m+1,r,L,R)); } }; void solve() { int n; cin >> n; vi a(n+1); for (int i=1;i<=n;i++) cin >> a[i]; vi ps[n+1]; stack<int> stk; for (int i = n;i>=1;i--) { while (!stk.empty() && a[stk.top()] <= a[i]) { ps[i].push_back(stk.top()); stk.pop(); } if (!stk.empty()) ps[i].push_back(stk.top()); stk.push(i); } int q; cin >> q; vector<Query> qs[n+1]; vi ans(q+1); for (int i=1;i<=q;i++) { int l,r; cin >> l >> r; qs[l].push_back({r,i}); } ST st(n,a); for (int i = n;i>=1;i--) { for (auto it : ps[i]) { int p = 2*it-i; st.update(1,1,n,p,n,a[i]+a[it]); } for (auto it : qs[i]) { ans[it.id] = st.query(1,1,n,i,it.r); } } for (int i=1;i<=q;i++) cout << ans[i] << '\n'; } int32_t main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifdef Dodi freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t = 1; //cin >> t; while (t --> 0) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...