#include #define in cin #define out cout #define abs(x) ((x>0)?(x):(-(x))) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define DOWNFOR(i, a, b) for(int i = a; i >= b; --i) #define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i) using namespace std; typedef long long ll; const int Nmax = 100001; int lg[Nmax],st[50],dr[50]; int N,v[Nmax],A[5*Nmax]; void upd(int i,int st,int dr,int &w,int &val){ if(st>=dr) A[i]=val; else{ int mij=(st+dr)/2; if(w<=mij) upd(2*i,st,mij,w,val); else upd(2*i+1,mij+1,dr,w,val); A[i]=max(A[2*i],A[2*i+1]); } } int query(int i,int st,int dr,int a,int b){ if(a<=st && dr<=b) return A[i]; int mij=(st+dr)/2; if(b<=mij) return query(2*i,st,mij,a,b); if(a>mij) return query(2*i+1,mij+1,dr,a,b); int aa=query(2*i,st,mij,a,mij); int bb=query(2*i+1,mij+1,dr,mij+1,b); return max(aa,bb); } int main(){ #ifndef ONLINE_JUDGE ifstream in("test.in"); ofstream out("test.out"); #endif for(int i=2;i>N; FOR(i,1,N) in>>v[i],upd(1,1,N,i,v[i]); ll best=-1LL*(1LL<<60); FOR(i,1,N){ ll cur; for(int j=0;j<=30;j++) if(st[j]){ int a=i+st[j]; int b=min( N, i+dr[j] ); if(a<=N){ cur=v[i] + query(1,1,N,a,b) - j; best=max(best,cur); } } } out<