#include 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; }