/* MindCoding 2016 Round 1 * * Beiland Arnold * standard c++11 source */ #include #include #include #include using namespace std; long long minf=numeric_limits::min()/2; std::vector tree; void update(int pos, long long val, int nod, int st, int dr){ if(st==dr) tree[nod]=val; else{ int mij=(st+dr)/2; if(pos<=mij) update(pos,val,nod<<1,st,mij); else update(pos,val,(nod<<1)+1,mij+1,dr); tree[nod]=std::max(tree[nod<<1],tree[(nod<<1)+1]); } } long long query(int a, int b, int nod, int st, int dr){ if(a<=st&&dr<=b) return tree[nod]; else{ long long maxim=minf; int mij=(st+dr)/2; if(a<=mij) maxim=std::max(maxim,query(a,b,nod<<1,st,mij)); if(b>mij) maxim=std::max(maxim,query(a,b,(nod<<1)+1,mij+1,dr)); return maxim; } } int main() { int n; cin>>n; tree.resize((n<<2)+10,minf); long long res=minf; for(int i=1;i<=n;++i){ long long x; cin>>x; if(i>1){ for(int k=1;k<18;++k) res=max(res, x+ query(max(1,i-(1<