#include #include #include #define oo INT_MIN using namespace std; long long Arb[300010], x, y, n, m, i, cod, j, l, sc, sol, xx, yy, ok; void build(long long nod, long long st, long long dr) { if(st == dr) { Arb[nod] = oo; return; } long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1; build(fiu_st, st, m); build(fiu_dr, m + 1, dr); Arb[nod] = max(Arb[fiu_st], Arb[fiu_dr]); } void update(long long nod, long long st, long long dr) { if(st == dr) { Arb[nod] = y; return; } long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1; if(x <= m) update(fiu_st, st, m); else update(fiu_dr, m + 1, dr); Arb[nod] = max(Arb[fiu_st], Arb[fiu_dr]); } long long query(long long nod, long long st, long long dr) { if(st >= x && dr <= y) return Arb[nod]; long long m = (st + dr) / 2, fiu_st = 2 * nod, fiu_dr = fiu_st + 1, vs = 0, vd = 0; if(x <= m)vs = query(fiu_st, st, m); if(y > m)vd = query(fiu_dr, m + 1, dr); return max(vs, vd); } int main() { cin >> n; build(1, 1, n); cin >> x; y = x; x = 1; update(1, 1, n); sol = oo; for(i = 2; i <= n; i++) { cin >> xx; x = i; y = xx; update(1, 1, n); ok = 1; for(j = 2, l = 0; ok ; j <<= 1, l++) { x = i - j + 1; if(x <= 0) x = 1, ok = 0; y = i - 1; yy = query(1, 1, n); sol = max(sol, yy + xx - l); } } cout << sol; return 0; }