Submission #464282

#TimeUsernameProblemLanguageResultExecution timeMemory
464282NintsiChkhaidzeTriple Jump (JOI19_jumps)C++14
100 / 100
1218 ms87872 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define pi pair<int,int> #define s second #define f first #define left (h<<1),l,((l+r)>>1) #define right ((h<<1)|1),((l+r)>>1) + 1,r using namespace std; const int N = 500005; int ans[N],t[4*N],add[4*N],T[4*N],n,a[N]; vector <pi> v[N]; vector <int> nx[N]; stack <int> st; void go(){ for (int i = 1; i <= n; i++){ while (st.size() && a[i] >= a[st.top()]){ nx[st.top()].pb(i); st.pop(); } if (st.size()) nx[st.top()].pb(i); st.push(i); } } void build(int h,int l,int r){ if (l == r){ T[h] = a[l]; return; } build(left),build(right); T[h] = max(T[h*2],T[h*2+1]); } void push(int h){ if (!add[h]) return; t[h*2] = max(t[h*2],T[h*2] + add[h]); t[h*2 + 1] = max(t[h*2 + 1],T[h*2 + 1] + add[h]); add[h*2] = max(add[h*2],add[h]); add[h*2 + 1] = max(add[h*2 + 1],add[h]); add[h] = 0; } void upd(int h,int l,int r,int L,int R,int val){ if (r < L || R < l) return; if (L <= l && r <= R){ t[h] = max(T[h] + val,t[h]); add[h] = max(add[h],val); return; } push(h); upd(left,L,R,val),upd(right,L,R,val); t[h] = max(t[h*2],t[h*2+1]); } int get(int h,int l,int r,int L,int R){ if (r < L || R < l) return 0; if (L <= l && r <= R) return t[h]; push(h); return max(get(left,L,R),get(right,L,R)); } signed main (){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); cin>>n; for (int i = 1; i <= n; i++) cin>>a[i]; go(); build(1,1,n); int q; cin>>q; for (int i=1;i<=q;i++){ int l,r; cin>>l>>r; v[l].pb({r,i}); } for (int i = n; i >= 1; i--){ for (auto id: nx[i]){ // a = i b = id c >= id + id - i if (2*id - i <= n) upd(1,1,n,2*id - i,n,a[i] + a[id]); } for (auto x: v[i]) ans[x.s] = get(1,1,n,i,x.f); } for (int i=1;i<=q;i++) cout<<ans[i]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...