#include using namespace std; const int INF = (1 << 30) - 1; const int MAX_N = 1e5 + 10; int AINT[2 << 18]; int n; void update(int node, int st, int dr, int poz, int val) { if(st == dr) { AINT[node] = val; } else { int mid = (st + dr) / 2; if(poz <= mid) update(2 * node, st, mid, poz, val); else update(2 * node + 1, mid + 1, dr, poz, val); AINT[node] = max(AINT[2 * node], AINT[2 * node + 1]); } } int query(int node, int st, int dr, int lo, int hi) { if(lo <= st && dr <= hi) return AINT[node]; int mid = (st + dr) / 2; int r1 = -INF, r2 = -INF; if(lo <= mid) r1 = query(2 * node, st, mid, lo, hi); if(mid + 1 <= hi) r2 = query(2 * node + 1, mid + 1, dr, lo, hi); return max(r1, r2); } int v[MAX_N]; int solve(int poz) { int bst = -INF; for(int lg = 0; poz - (1 << lg) >= 1; lg++) { int lo = poz - (1 << (lg + 1)) + 1; int score = query(1, 1, n, lo, poz - 1) + v[poz] - lg; if(score > bst) bst = score; } return bst; } int main() { cin >> n; for(int i = 1; i <= n; ++i) { cin >> v[i]; update(1, 1, n, i, v[i]); } int best = -INF; for(int i = 1; i <= n; ++i) { int now = solve(i); if(now > best) best = now; } cout << best << "\n"; return 0; }