#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int INF = (1<<31)-1;

vector<int> lg, a, tree;
int N, pos, val, Solution;

void Prepare();
void Solve();
void Write();
int Query(int node, int left, int right, int a, int b);

int main()
{
    Prepare();
    Solve();
    Write();
    return 0;
}
int Query(int node, int left, int right, int a, int b)
{
    int ans = -INF;
    if( ( a <= left && right <= b ) || left == right)
        return tree[node];
    int mid = (left + right) >> 1;
    if(a <= mid)
        ans = max(ans, Query(node<<1, left, mid, a, b) );
    if(b > mid)
        ans = max(ans, Query((node<<1) + 1, mid+1, right, a, b) );
    return ans;
}
void Build(int node, int left, int right)
{
    if(left == right) {
        tree[node] = a[left];
        return;
    }
    int mid = (left+right) >> 1;
    Build(node<<1, left, mid);
    Build( (node<<1) + 1, mid+1, right);
    tree[node] = max(tree[node<<1], tree[(node<<1)+1]);
}
void Solve()
{
    for(int i=1; i<=N; ++i) {
        scanf("%d", &val);
        a.push_back(val);
    }
    Build(1, 1, N);
    Solution = -INF;
    for(pos=1; pos<N; ++pos)
        for(int k=0; (1<<k) < N; ++k) {
            int r = pos + (1<<k);
            int l = pos + 1;
            Solution = max(Solution, (a[pos] + Query(1, 1, N, l, min(r, N) ) - lg[min(r, N) - pos]) ) ;
        }
}
void Prepare()
{
    //freopen("reddragon.in", "rt", stdin);
    //freopen("reddragon.out", "wt",stdout);
    scanf("%d", &N);
    tree.assign(4*N, -INF);
    lg.assign(2, 0);
    for(int i=2; i<=2*N; ++i)
        lg.push_back(lg[i>>1] + 1);
    a.push_back(0);
}
void Write()
{
    cout<<Solution<<'\n';
}