#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, a[N];
struct Node {
  int L, R;
  Node(int L = 0, int R = 0) : L(L), R(R) {}
} tr[21][N << 2];
Node jp[N][21];
Node merge(Node a, Node b) {
  if (a.R < b.R) a.R = b.R;
  if (a.L > b.L) a.L = b.L;
  return a;
}
void up(int o, int typ) {
  tr[typ][o] = merge(tr[typ][o << 1], tr[typ][o << 1 | 1]);
}
void build(int o, int l, int r, int typ) {
  if (l == r) {
    tr[typ][o] = jp[l][typ];
    return;
  }
  int mid = l + r >> 1;
  build(o << 1, l, mid, typ);
  build(o << 1 | 1, mid + 1, r, typ);
  up(o, typ);
}
Node query(int o, int l, int r, int ql, int qr, int typ) {
  if (ql <= l && r <= qr) {
    return tr[typ][o];
  }
  int mid = l + r >> 1;
  if (ql <= mid && mid < qr) {
    return merge(query(o << 1, l, mid, ql, qr, typ),
                 query(o << 1 | 1, mid + 1, r, ql, qr, typ));
  } else {
    if (ql <= mid)
      return query(o << 1, l, mid, ql, qr, typ);
    else
      return query(o << 1 | 1, mid + 1, r, ql, qr, typ);
  }
}
void init() {
  for (int i = 1; i <= n * 3; i++) {
    jp[i][0].L = max(1, i - a[i]);
    jp[i][0].R = min(n * 3, i + a[i]);
  }
  build(1, 1, n * 3, 0);
  for (int j = 1; j < 20; j++) {
    for (int i = 1; i <= n * 3; i++) {
      jp[i][j] = query(1, 1, n * 3, jp[i][j - 1].L, jp[i][j - 1].R, j - 1);
    }
    build(1, 1, n * 3, j);
  }
}
int calc(int pos) {
  int time = 0;
  Node ans = Node(pos, pos), tmp;
  for (int Lg = 19; Lg >= 0; Lg--) {
    tmp = query(1, 1, n * 3, ans.L, ans.R, Lg);
    if (tmp.R - tmp.L + 1 < n) {
      ans = tmp;
      time += 1 << Lg;
    }
  }
  return time + 1;
}
int main() {
  cin >> n;
  if (n == 1) {
    return puts("0"), 0;
  }
  for (int i = 1; i <= n; i++)
    scanf("%d", &a[i]), a[(2 * n) + i] = a[n + i] = a[i];
  init();
  for (int i = 1; i <= n; i++) {
    if ((a[i] << 1) + 1 >= n) {
      putchar('1');
      putchar(' ');
      continue;
    }
    int ans = calc(i + n);
    printf("%d ", ans);
  }
  return 0;
}
