#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const double eps = 1e-10;
const double pi = acos(-1.0);
inline int read() {
  int x = 0, f = 1;
  char ch;
  ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch & 15);
    ch = getchar();
  }
  if (f)
    return x;
  else
    return -x;
}
const int N = 3e5 + 10;
int n, R[N];
int LL[N][20], RR[N][20];
struct segment_tree {
  int minn[N << 2], maxn[N << 2];
  void pushup(int rt) {
    minn[rt] = min(minn[rt << 1], minn[rt << 1 | 1]);
    maxn[rt] = max(maxn[rt << 1], maxn[rt << 1 | 1]);
  }
  void build(int id, int l, int r, int rt) {
    if (l == r) {
      minn[rt] = LL[l][id];
      maxn[rt] = RR[l][id];
      return;
    }
    int mid = (l + r) >> 1;
    build(id, l, mid, rt << 1);
    build(id, mid + 1, r, rt << 1 | 1);
    pushup(rt);
  }
  int query_min(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) return minn[rt];
    int mid = (l + r) >> 1, ret = inf;
    if (L <= mid) ret = min(ret, query_min(L, R, l, mid, rt << 1));
    if (R > mid) ret = min(ret, query_min(L, R, mid + 1, r, rt << 1 | 1));
    return ret;
  }
  int query_max(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) return maxn[rt];
    int mid = (l + r) >> 1, ret = -inf;
    if (L <= mid) ret = max(ret, query_max(L, R, l, mid, rt << 1));
    if (R > mid) ret = max(ret, query_max(L, R, mid + 1, r, rt << 1 | 1));
    return ret;
  }
} Seg[20];
int main() {
  n = read();
  for (int i = 1; i <= n; i++) R[i] = R[i + n] = R[i + (n << 1)] = read();
  for (int i = 1; i <= n * 3; i++)
    LL[i][0] = max(1, i - R[i]), RR[i][0] = min(n * 3, i + R[i]);
  Seg[0].build(0, 1, n * 3, 1);
  for (int i = 1; i <= 18; i++) {
    for (int j = 1; j <= n * 3; j++)
      LL[j][i] = Seg[i - 1].query_min(LL[j][i - 1], RR[j][i - 1], 1, n * 3, 1),
      RR[j][i] = Seg[i - 1].query_max(LL[j][i - 1], RR[j][i - 1], 1, n * 3, 1);
    Seg[i].build(i, 1, n * 3, 1);
  }
  for (int i = n + 1; i <= n * 2; i++) {
    int ans = 0, nl = i, nr = i, tl, tr;
    for (int j = 18; j >= 0; j--) {
      tl = Seg[j].query_min(nl, nr, 1, n * 3, 1);
      tr = Seg[j].query_max(nl, nr, 1, n * 3, 1);
      if (tr - tl + 1 < n) ans += (1 << j), nl = tl, nr = tr;
    }
    if (nr - nl + 1 < n)
      printf("%d ", ans + 1);
    else
      printf("%d ", ans);
  }
  printf("\n");
  return 0;
}
