#include using namespace std; const int MAX_N = 100000 + 1; const int INF = numeric_limits::min(); int A[MAX_N]; int tree[4 * MAX_N]; int N; void build(int node, int l, int r) { if (l == r) tree[node] = A[l]; else { int m = (l + r) / 2; build(2 * node, l, m); build(2 * node + 1, m + 1, r); tree[node] = max(tree[2 * node], tree[2 * node + 1]); } } int query(int node, int st, int dr, int l, int r) { if (l <= st && dr <= r) return tree[node]; else { int m = (st + dr) / 2; int sol = INF; if (l <= m) sol = max(sol, query(2 * node, st, m, l, r)); if (m < r) sol = max(sol, query(2 * node + 1, m + 1, dr, l, r)); return sol; } } int main() { ios_base::sync_with_stdio(false); cin >> N; for (int i = 1; i <= N; ++i) cin >> A[i]; fill(tree, tree + MAX_N - 1, INF); build(1, 1, N); long long sol = -1LL * INF * INF; for (int i = 1; i <= N; ++i) for (int j = 0; (1 << j) < N; ++j) { int p = 1 << (j + 1); int l = i + 1; int r = i + p - 1; sol = max(sol, 1LL * A[i] + query(1, 1, N, l, min(r, N)) - j); } cout << sol << "\n"; return 0; }