#include <iostream>
#include <cstdio>

#define INF 10000000000
#define NMAX 50005

using namespace std;

long long n , st , dr , ans = -INF , mx;
long long v[NMAX] , arbint[5 * NMAX];

void read(long long &x) {
    int sign = 1;
    char ch;

    while(!isdigit(ch = getchar())) {
        if(ch == '-') {
            sign = -1;
        }

        else {
            sign = 1;
        }
    }

    do {
        x = x * 10 + ch - '0';
    }while(isdigit(ch = getchar()));

    x *= sign;
}

void query(long long a , long long b , long long st , long long dr , long long nr);
void pr(long long st , long long dr , long long nr);

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

    read(n);

    for(int i = 1 ; i <= n ; ++i) {
        read(v[i]);
    }

    pr(1 , n , 1);

    for(long long i = 1 ; i <= n ; ++i) {
        for(long long j = 1 , nr = 0 ; j < i ; j <<= 1 , ++nr) {
            long long st = max(i - 2 * j + 1 , (long long)1);
            long long dr = i - j;

            mx = -INF;
            query(st , dr , 1 , n , 1);

            ans = max(ans , mx + v[i] - nr);
        }
    }

    cout << ans;
    return 0;
}


void pr(long long st , long long dr , long long nr) {
    if(st == dr) {
        arbint[nr] = v[st];
        return;
    }

    long long mij = (st + dr) / 2;
    pr(st , mij , nr * 2);
    pr(mij + 1 , dr , nr * 2 + 1);

    arbint[nr] = max(arbint[2 * nr] , arbint[2 * nr + 1]);
}

void query(long long a , long long b , long long st , long long dr , long long nr) {
    if(st == dr) {
        mx = max(mx , arbint[nr]);
        return;
    }

    long long mij = (st + dr) / 2;

    if(a <= mij) {
        query(a , b , st , mij , 2 * nr);
    }

    if(b > mij) {
        query(a , b , mij + 1 , dr , 2 * nr + 1);
    }
}