#include<bits/stdc++.h>
#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<Nmax;i++){
        lg[i]=lg[i/2]+1;
        dr[lg[i]]=i;
        if(st[lg[i]]==0) st[lg[i]]=i;
    }
    st[0]=1,dr[0]=1;
    in>>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<<best<<'\n';
    return 0;
}