/** * author: enot.1.10, Vladimir Smykalov (enot.1.10@gmail.com) * created: 12.02.2016 20:22:20 **/ #define __USE_MINGW_ANSI_STDIO 0 #include #define F first #define S second #define pb push_back #define mp make_pair #define forn(i, n) for(int i = 0 ; (i) < (n) ; ++i) #define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define sz(a) ((int)(a).size()) #define all(a) (a).begin(),a.end() #define pw(x) (1LL<<(x)) using namespace std; typedef long long ll; typedef double dbl; typedef vector vi; typedef pair pi; const int inf = (int)1.01e9; const dbl eps = 1e-9; /* --- main part --- */ #define TASK "1" const int N = 1 << 17; int t[2 * N]; inline int get (int l, int r) { l += N; r += N; int res = t[l]; while (l <= r) { if ((l & 1) == 1) res = max(res, t[l]); if ((r & 1) == 0) res = max(res, t[r]); l = (l + 1) >> 1; r = (r - 1) >> 1; } return res; } int a[N]; int main() { #ifdef home assert(freopen(TASK".in", "r", stdin)); assert(freopen(TASK".out", "w", stdout)); #endif int n; scanf("%d", &n); forn(i, n) scanf("%d", a + i); forn(i, n) t[i + N] = a[i]; for (int i = N - 1; i >= 1; --i) t[i] = max(t[2 * i], t[2 * i + 1]); ll res = -1e17; forn(i, n) { for (int z = 0; ; ++z) { int l = i + pw(z); int r = i + pw(z + 1) - 1; if (l >= n) break; r = min(r, n - 1); res = max(res, a[i] + (ll)get(l, r) - z); } } cout << res << endl; #ifdef home eprintf("Time: %d ms\n", (int)(clock() * 1000. / CLOCKS_PER_SEC)); #endif return 0; }