Submission #908144

#TimeUsernameProblemLanguageResultExecution timeMemory
908144arashMLGTriple Jump (JOI19_jumps)C++17
0 / 100
295 ms66476 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; const int N = 5e5 + 23; const ll inf = 1e18; #define F first #define S second #define pb push_back #define sz(x) ((int)x.size()) #define kill(x) cout<<x , exit(0); #define all(x) x.begin(),x.end() #define lc (v<<1) #define rc ((v<<1)|1) #define debug(x) cerr<< #x << " : " << x << '\n'; #define int unsigned int struct Seg { int t[N<<2]; Seg() { fill(t,t+(N<<2),0); } void clear() { fill(t,t+(N<<2),0); } void upd(int pos,int x,int v=1,int tl=1,int tr= N) { if(tr-tl==1) { t[v] = max(t[v],x); return; } int mid=(tl+tr)/2; if(pos<mid) upd(pos,x,lc,tl,mid); else upd(pos,x,rc,mid,tr); t[v] = max(t[lc],t[rc]); } int get(int l,int r,int v=1,int tl=1,int tr= N) { if(l > r) return 0; if(l == tl && r == tr-1) return t[v]; int mid=(tl + tr)/2; return max(get(l,min(mid-1,r),lc,tl,mid) , get(max(l,mid),r,rc,mid,tr)); } }seg,mx; int n,q; int a[N]; vector<pair<int,int>> Q[N]; vector<pair<int,int>> here[N]; int ans[N]; vector<int> st; vector<pair<int,int> > edges; int32_t main() { cin>>n; for(int i = 1; i<= n ; i ++) { cin>>a[i]; mx.upd(i,a[i]); } cin>>q; st.pb(0); for(int i = 1; i<= n ; i++) { while(st.back() && a[st.back()] < a[i]) st.pop_back(); if(sz(st) > 1) { edges.pb({st.back(),i}); if(sz(st) > 2) { edges.pb({ st[sz(st)-2],i}); } } st.pb(i); } st.clear(); st.pb(0); for(int i = n ; i >= 1;i --) { while(st.back() && a[st.back()] < a[i]) st.pop_back(); if(sz(st) > 1) { edges.pb({i,st.back()}); if(sz(st) > 2) { edges.pb({i,st[sz(st)-2]}); } } st.pb(i); } for(int i = 1; i< n ; i++) { edges.pb({i,n}); } for(auto [l,r] : edges) { here[l].pb({r,a[l] + a[r] + mx.get(l+1,(l+r)/2)}); } for(int i = 0; i < q; i ++) { int l,r; cin>>l>>r; Q[l].pb({r,i}); } for(int i = n; i>= 1;i --) { for(auto [r,val] : here[i]) { seg.upd(r,val); } for(auto [r,id] : Q[i]) ans[id] = seg.get(i,r); } for(int i = 0 ; 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...