/* MindCoding 2016 Round 1
 *
 * Beiland Arnold
 * standard c++11 source
 */
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <limits>
using namespace std;

long long minf=numeric_limits<long long>::min()/2;

std::vector<long long> 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=0;
        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;

        for(int k=1;;++k){
            int c=1<<k;
            if(c>i) break;

            res=max(res, x+ query(i-(1<<k)+1, i-1, 1,1,n)  - (k-1));
        }

        update(i,x,1,1,n);
    }

    cout<<res<<'\n';
}