#include <iostream>
#include <set>

#define lint long long int
using namespace std;

int v[100005];

multiset <int> Set;

void add(int val) {
    Set.insert(val);
}

void erase(int val) {
    Set.erase(Set.find(val));
}

lint get_best() {
    multiset <int> :: iterator it = Set.end();

    -- it;
    lint ans = *it;

    -- it;
    ans += *it;

    return ans;
}

int main()
{
    int n = 0;
    cin >> n;

    for (int i = 1; i <= n; ++ i)
        cin >> v[i];

    lint best = -1e18 - 15;
    for (int step = 2, scad = 0; step <= 2 * n; step *= 2, ++ scad) {
        Set.clear();


        lint best_aux = -1e18 - 15, aux;
        for (int i = 1; i <= n; ++ i) {
            add(v[i]);
            if (i - step >= 1)
                erase(v[i - step]);

            if (i > 1) {
                aux = get_best();
                if (aux > best_aux)
                    best_aux = aux;
            }
        }

        if (best_aux - scad > best)
            best = best_aux - scad;
    }

    cout << best << '\n';
    return 0;
}