#include <iostream>
#include <climits>
#include <algorithm>
#define oo INT_MIN


using namespace std;
long long Arb[300010],  x, y, n, m, i, cod, j, l, sc, sol, xx, yy;
void build(long long nod, long long st, long long dr) {
    if(st == dr) {
        Arb[nod] = oo;
        return;
    }

    long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1;
    build(fiu_st, st, m);
    build(fiu_dr, m + 1, dr);
    Arb[nod] = max(Arb[fiu_st], Arb[fiu_dr]);
}
void update(long long nod, long long st, long long dr) {
    if(st == dr) {
        Arb[nod] = y;
        return;
    }

    long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1;

    if(x <= m)
        update(fiu_st, st, m);
    else
        update(fiu_dr, m + 1, dr);

    Arb[nod] = max(Arb[fiu_st], Arb[fiu_dr]);
}
long long query(long long nod, long long st, long long dr) {
    if(st >= x && dr <= y)
        return Arb[nod];

    long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1, vs = 0, vd = 0;

    if(x <= m)vs = query(fiu_st, st, m);

    if(y > m)vd = query(fiu_dr, m + 1, dr);

    return max(vs, vd);
}
int main() {
    cin >> n;
    build(1, 1, n);
    cin >> x;
    update(1, 1, n);

    for(i = 2; i <= n; i++) {
        cin >> xx;
        x = i;
        y = xx;
        update(1, 1, n);

        for(j = 2, l = 0; i - j > 0; j <<= 1, l++) {
            x = i - j + 1;
            y = i - 1;
            yy = query(1, 1, n);
            sc = max(sc, yy + xx - l);
        }

        sol = max(sol, sc);
    }

    cout << sol;
    return 0;
}