#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, d[N];
inline int read() {
  int x = 0, p = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') p = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * p;
}
struct DATA {
  int l, r;
  DATA() {}
  DATA(int L, int R) : l(L), r(R) {}
  DATA operator+(const DATA& p) const { return DATA(min(l, p.l), max(r, p.r)); }
} e[N];
struct TREE {
  DATA tree[N << 2];
  void built(int root, int l, int r) {
    if (l == r) {
      tree[root] = e[l];
      return;
    }
    int mid = l + r >> 1;
    built(root << 1, l, mid);
    built(root << 1 | 1, mid + 1, r);
    tree[root] = tree[root << 1] + tree[root << 1 | 1];
  }
  DATA query(int root, int l, int r, int a, int b) {
    if (a <= l && b >= r) return tree[root];
    int mid = l + r >> 1;
    if (b <= mid) return query(root << 1, l, mid, a, b);
    if (a > mid) return query(root << 1 | 1, mid + 1, r, a, b);
    return query(root << 1, l, mid, a, b) +
           query(root << 1 | 1, mid + 1, r, a, b);
  }
} zy[20];
void init() {
  n = read();
  for (int i = 1; i <= n; ++i) {
    d[i] = d[i + n] = d[i + 2 * n] = read();
  }
}
void solve() {
  if (n == 1) {
    puts("0");
    return;
  }
  int x = 3 * n;
  for (int i = 1; i <= x; ++i) {
    e[i].l = max(1, i - d[i]);
    e[i].r = min(x, i + d[i]);
  }
  zy[0].built(1, 1, x);
  for (int i = 1; i < 20; ++i) {
    for (int j = 1; j <= x; ++j) {
      e[j] = zy[i - 1].query(1, 1, x, e[j].l, e[j].r);
    }
    zy[i].built(1, 1, x);
  }
  int s = n + 1, t = n + n;
  for (int i = s; i <= t; ++i) {
    int ret = 0;
    DATA f = DATA(i, i);
    for (int j = 19; j >= 0; --j) {
      DATA g = zy[j].query(1, 1, x, f.l, f.r);
      if (g.r - g.l < n - 1) f = g, ret += (1 << j);
    }
    cout << ret + 1 << ' ';
  }
  puts("");
}
int main() {
  init();
  solve();
  return 0;
}
