#include <iostream>

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);
    int score = query(1, 1, n, lo, poz - 1) + v[poz] - lg + 1;
    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;
}