#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define sz size
#define mp make_pair
#define ll long long

const int NMAX = 100005;
const long long INF = (1LL<<59);

int n, a[NMAX], aint[4*NMAX];

void faAint(int node, int st, int dr){
    if (st == dr){
        aint[node] = a[st];
    }else{
        int mij = (st + dr) / 2;
        faAint(node*2, st, mij);
        faAint(node*2+1, mij+1, dr);
        aint[node] = max(aint[node*2], aint[node*2+1]);
    }
}

void query(int node, int st, int dr, int a, int b, int &ans){
    if (a <= st && dr <= b){
        ans = max(ans, aint[node]);
    }else{
        int mij = (st + dr) / 2;
        if (a <= mij){
            query(node*2, st, mij, a, b, ans);
        }
        if (b > mij){
            query(node*2+1, mij+1, dr, a, b, ans);
        }
    }
}

int main(){
    //freopen("test.in", "r", stdin);
    cin >> n;
    for(int i=1; i<=n; ++i){
        cin >> a[i];
    }

    faAint(1, 1, n);


    ll anss = -INF;
    for(int i=1; i<=n; ++i){
        int prev = i+1;
        for(int j=2,r=0; ; j*=2, ++r){
            int newI = i + j -1;
            int flag = 0;
            if (newI > n){
                newI = n;
                flag = 1;
            }
            int maxx = -2000000000;
            if (i+1 <= newI) query(1, 1, n, prev, newI, maxx);
            ll currentAns = 1LL*a[i] +maxx - r;
            //cout << i << " " << newI << " " << r << " "  << a[i] << " " << maxx << " " << currentAns << "\n";
            //if (i == 45)cout << i << " " << prev << " " << newI << " " << r << "\n";
            anss = max(anss, currentAns);
            if (flag == 1){
                break;
            }
            prev = newI + 1;
        }
    }

    cout << anss << "\n";


    return 0;
}