Submission #1161665

#TimeUsernameProblemLanguageResultExecution timeMemory
1161665sofija6Triple Jump (JOI19_jumps)C++20
100 / 100
912 ms96332 KiB
#include <bits/stdc++.h> #define ll long long #define MAXN 500010 using namespace std; ll n,sz,a[MAXN],ans[MAXN]; vector<ll> p[MAXN]; vector<pair<ll,ll> > queries[MAXN]; struct element { ll sum,maxx; }; element neutral={0,0}; element Merge(element x,element y) { return {max(x.sum,y.sum),max(x.maxx,y.maxx)}; } struct seg_tree { vector<element> st; vector<ll> lazy; void Init() { sz=1; while (sz<n) sz <<= 1; st.resize(2*sz+2,neutral); lazy.resize(2*sz+2); } void Build() { for (ll i=sz;i<sz+n;i++) st[i]={0,a[i-sz+1]}; for (ll i=sz-1;i>0;i--) st[i]=Merge(st[2*i],st[2*i+1]); } void Propagate(ll x) { st[x].sum=max(st[x].sum,lazy[x]+st[x].maxx); if (x<sz) { lazy[2*x]=max(lazy[2*x],lazy[x]); lazy[2*x+1]=max(lazy[2*x+1],lazy[x]); } lazy[x]=0; } void Update(ll l,ll r,ll val,ll x,ll lx,ll rx) { Propagate(x); if (lx>r || rx<l) return; if (lx>=l && rx<=r) { lazy[x]=val; Propagate(x); return; } ll mid=(lx+rx)/2; Update(l,r,val,2*x,lx,mid); Update(l,r,val,2*x+1,mid+1,rx); st[x]=Merge(st[2*x],st[2*x+1]); } ll Calc(ll l,ll r,ll x,ll lx,ll rx) { Propagate(x); if (lx>r || rx<l) return 0; if (lx>=l && rx<=r) return st[x].sum; ll mid=(lx+rx)/2; return max(Calc(l,r,2*x,lx,mid),Calc(l,r,2*x+1,mid+1,rx)); } }; seg_tree S; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll q,l,r; cin >> n; for (ll i=1;i<=n;i++) cin >> a[i]; stack<ll> s; for (ll i=n;i>0;i--) { while (!s.empty() && a[s.top()]<=a[i]) { p[i].push_back(s.top()); s.pop(); } if (!s.empty()) p[i].push_back(s.top()); s.push(i); } cin >> q; for (ll i=1;i<=q;i++) { cin >> l >> r; queries[l].push_back({r,i}); } S.Init(); S.Build(); for (ll i=n;i>0;i--) { for (ll j : p[i]) { if (2*j-i<=n) S.Update(2*j-i,n,a[i]+a[j],1,1,sz); } for (auto j : queries[i]) ans[j.second]=S.Calc(i,j.first,1,1,sz); } for (ll i=1;i<=q;i++) cout << ans[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...