#include <bits/stdc++.h>

using namespace std;

int V[500000];

int T[1000000];
void init(int node, int b, int e) {
    if(b == e) T[node] = V[b];
    else {
        int m = b + e >> 1;
        init(node*2, b, m);
        init(node*2+1, m+1, e);
        T[node] = max(T[node*2], T[node*2+1]);
    }
}

int query(int node, int b, int e, int l, int r) {
    if(l == 0) return -2e9;
    if(l <= b && e <= r) return T[node];
    if(r < b || l > e) return -2e9;

    int m = b + e >> 1;
    return max(query(node*2, b, m, l, r), query(node*2+1, m+1, e, l, r));
}

int main() {
    #ifndef ONLINE_JUDGE
    //freopen("debug", "r", stdin);
    #endif // ONLINE_JUDGE

    int n;
    cin >> n;

    for(int i=1; i<=n; i++) {
        cin >> V[i];
    }

    init(1, 1, n);

    int best = -2e9;

    for(int i=2; i<=n; i++) {
        for(int j=0; (1 << j) < i; j++) {
            best = max(best, V[i] + query(1, 1, n, i - (1 << (j + 1)) + 1, i - 1) - j);
        }
    }

    cout << best;

    return 0;
}