#include<bits/stdc++.h>

using namespace std;

#define dbg(x) (cout<<#x<<" = "<<(x)<<'\n')

typedef long long int lld;
const int INF = (1LL << 30) - 1;
const lld LINF = (1LL << 62) - 1;
const int NMAX = 100000 + 5;

int N;
int V[NMAX];
int RMQ[17][NMAX];
int p2[17];
int lg2[NMAX];
lld sol;

void build() {
	int i, j, p;

	for (i = 1; i <= N; i++)
		RMQ[0][i] = V[i];

	for (i = 1, p = 2; p <= N; i++, p *= 2)
		for (j = 1; j + p / 2 <= N; j++)
			RMQ[i][j] = max(RMQ[i - 1][j], RMQ[i - 1][j + p / 2]);

	for (i = 2; i <= N; i++)
		lg2[i] = lg2[i / 2] + 1;

	p2[0] = 1;

	for (i = 1; i <= lg2[N]; i++)
		p2[i] = p2[i - 1] * 2;
}

int query(int x, int y) {
	int d = y - x + 1;
	int i = lg2[d];
	int p = p2[i];

	return max(RMQ[i][x], RMQ[i][y - p + 1]);
}

int main() {
	cin.sync_with_stdio(false);

	#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	#endif

	scanf("%d", &N);

	for (int i = 1; i <= N; i++)
		scanf("%d", &V[i]);

	build();

	sol = V[1] * 1LL + V[2];

	for (int p = 0; p <= 16; p++) {
		for (int i = 1, j = 1 + (1 << p), k = (1 << (p + 1)); j <= N; i++, j++, k++) {
			k = min(k, N);
			sol = max(sol, V[i] * 1LL + query(j, k) - p);
		}
	}

	printf("%lld\n", sol);

	return 0;
}