#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 100000 + 1;
const int INF = numeric_limits<int>::min();

int A[MAX_N];
int tree[4 * MAX_N];
int N;

void build(int node, int l, int r)
{
    if (l == r)
        tree[node] = A[l];
    else
    {
        int m = (l + r) / 2;

        build(2 * node, l, m);
        build(2 * node + 1, m + 1, r);

        tree[node] = max(tree[2 * node], tree[2 * node + 1]);
    }
}

int query(int node, int st, int dr, int l, int r)
{
    if (l <= st && dr <= r)
        return tree[node];
    else
    {
        int m = (st + dr) / 2;
        int sol = INF;

        if (l <= m)
            sol = max(sol, query(2 * node, st, m, l, r));

        if (m < r)
            sol = max(sol, query(2 * node + 1, m + 1, dr, l, r));

        return sol;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);

    cin >> N;

    for (int i = 1; i <= N; ++i)
        cin >> A[i];

    fill(tree, tree + MAX_N - 1, INF);
    build(1, 1, N);

    long long sol = -1LL * INF * INF;

    for (int i = 1; i <= N; ++i)
        for (int j = 0; (1 << j) < N; ++j)
        {
            int p = 1 << (j + 1);
            int l = i + 1;
            int r = i + p - 1;

            sol = max(sol, 1LL * A[i] + query(1, 1, N, l, min(r, N)) - j);
        }

    cout << sol << "\n";

    return 0;
}