/**
 *    author:  enot.1.10, Vladimir Smykalov (enot.1.10@gmail.com)
 *    created: 12.02.2016 20:22:20       
**/
#define __USE_MINGW_ANSI_STDIO 0
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back
#define mp make_pair
#define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i)
#define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(),a.end()
#define pw(x) (1LL<<(x))

using namespace std;

typedef long long ll;
typedef double dbl;
typedef vector<int> vi;
typedef pair<int, int> pi;

const int inf = (int)1.01e9;
const dbl eps = 1e-9;

/* --- main part --- */

#define TASK "1"

const int N = 1 << 17;

int t[2 * N];

inline int get (int l, int r)
{
    l += N;
    r += N;
    int res = t[l];
    while (l <= r)
    {
        if ((l & 1) == 1) res = max(res, t[l]);
        if ((r & 1) == 0) res = max(res, t[r]);
        l = (l + 1) >> 1;
        r = (r - 1) >> 1;
    }
    return res;
}

int a[N];



int main()
{
    #ifdef home
        assert(freopen(TASK".in", "r", stdin));
        assert(freopen(TASK".out", "w", stdout));
    #endif
    int n;
    scanf("%d", &n);
    forn(i, n) scanf("%d", a + i);
    forn(i, n) t[i + N] = a[i];
    for (int i = N - 1; i >= 1; --i) t[i] = max(t[2 * i], t[2 * i + 1]);
    ll res = 0;
    forn(i, n)
    {
        for (int z = 0; ; ++z)
        {
            int l = i + pw(z);
            int r = i + pw(z + 1) - 1;
            if (l >= n) break;
            r = min(r, n - 1);
            res = max(res, a[i] + (ll)get(l, r) - z);
        }
    }
    cout << res << endl;
    #ifdef home
        eprintf("Time: %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC));
    #endif
    return 0;
}