Submission #1320456

#TimeUsernameProblemLanguageResultExecution timeMemory
1320456maxFedorchukTriple Jump (JOI19_jumps)C++20
100 / 100
803 ms77624 KiB
#include <bits/stdc++.h> using namespace std; const long long MX=5e5+10,INF=1e9; long long a[MX],ans[MX]; vector < pair < long long , long long > > goodpairs; long long n; struct nd { long long mxa; long long mxc; long long mxabc; } tree[4*MX]; void smlupd(long long v,long long zn) { tree[v].mxa=max(tree[v].mxa,zn); tree[v].mxabc=max(tree[v].mxabc,tree[v].mxc+tree[v].mxa); } long long fget(long long v,long long tl,long long tr,long long l,long long r) { if(tr<l || r<tl){ return 0; } if(l<=tl && tr<=r){ return tree[v].mxabc; } smlupd(v*2,tree[v].mxa); smlupd(v*2+1,tree[v].mxa); long long mid=(tl+tr)/2; return max(fget(v*2,tl,mid,l,r),fget(v*2+1,mid+1,tr,l,r)); } long long clc(pair < long long , long long > zp) { return fget(1,1,n,zp.first,zp.second); } void build(long long v,long long tl,long long tr) { if(tl==tr){ tree[v].mxc=a[tl]; return; } long long mid=(tl+tr)/2; build(v*2,tl,mid); build(v*2+1,mid+1,tr); tree[v].mxc=max(tree[v*2].mxc,tree[v*2+1].mxc); } void upd(long long v,long long tl,long long tr,long long l,long long r,long long zn) { if(r<tl || tr<l){ return; } if(l<=tl && tr<=r){ smlupd(v,zn); return; } smlupd(v*2,tree[v].mxa); smlupd(v*2+1,tree[v].mxa); long long mid=(tl+tr)/2; upd(v*2,tl,mid,l,r,zn); upd(v*2+1,mid+1,tr,l,r,zn); tree[v].mxabc=max(tree[v*2].mxabc,tree[v*2+1].mxabc); } void fad(pair < long long , long long > pr) { long long va=pr.first; long long vb=pr.second; if(2*vb-va<=n) { upd(1,1,n,2*vb-va,n,a[va]+a[vb]); } } void clcgoodpair() { stack < pair < long long , long long > > st; st.push({INF,0}); for(long long i=1;i<=n;i++){ while(st.top().first<a[i]){ st.pop(); } if(st.top().second!=0){ goodpairs.push_back({st.top().second,i}); } st.push({a[i],i}); } while(!st.empty()){ st.pop(); } st.push({INF,n+1}); for(long long i=n;i>=1;i--){ while(st.top().first<=a[i]){ st.pop(); } if(st.top().second!=n+1){ goodpairs.push_back({i,st.top().second}); } st.push({a[i],i}); } } int main() { cin.tie(0); ios_base::sync_with_stdio(0); cin>>n; for(long long i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); clcgoodpair(); vector < pair < pair < long long , long long > , long long > > zap; long long q; cin>>q; for(long long i=1;i<=q;i++){ long long l,r; cin>>l>>r; zap.push_back({{l,r},i}); } sort(goodpairs.begin(),goodpairs.end()); reverse(goodpairs.begin(),goodpairs.end()); goodpairs.push_back({0,0}); sort(zap.begin(),zap.end()); reverse(zap.begin(),zap.end()); zap.push_back({{0,0},0}); long long ukv=0,ukz=0; for(long long i=n;i>=1;i--){ while(goodpairs[ukv].first==i){ fad(goodpairs[ukv]); ukv++; } while(zap[ukz].first.first==i){ ans[zap[ukz].second]=clc(zap[ukz].first); ukz++; } } for(long long 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...