#include <bits/stdc++.h>
using namespace std;
const int oo = 1e9;
struct range {
  int l, r;
  range operator+(range a) { return {min(l, a.l), max(r, a.r)}; }
  range operator+=(range a) { return *this = *this + a; }
} val[20][300005];
struct {
  range seg[1200005];
  range query(int u, int l, int r, int L, int R) {
    if (L <= l && r <= R) {
      return seg[u];
    }
    int m = l + r >> 1;
    range res = {oo, -oo};
    if (L <= m) {
      res += query(u << 1, l, m, L, R);
    }
    if (m < R) {
      res += query(u << 1 | 1, m + 1, r, L, R);
    }
    return res;
  }
  void build(int u, int l, int r, range *arr) {
    if (l == r) {
      seg[u] = arr[l];
      return;
    }
    int m = l + r >> 1;
    build(u << 1, l, m, arr);
    build(u << 1 | 1, m + 1, r, arr);
    seg[u] = seg[u << 1] + seg[u << 1 | 1];
  }
} seg[20];
int main() {
  int n;
  cin >> n;
  if (n == 1) {
    cout << 0 << endl;
    return 0;
  }
  vector<int> arr(n);
  copy(istream_iterator<int>(cin), istream_iterator<int>(), arr.begin());
  arr.insert(arr.end(), arr.begin(), arr.end());
  arr.insert(arr.end(), arr.begin(), arr.end());
  int m = n * 3;
  for (int i = 0; i < m; i++) {
    val[0][i].l = max(0, i - arr[i]);
    val[0][i].r = min(m - 1, i + arr[i]);
  }
  seg[0].build(1, 0, m - 1, val[0]);
  for (int i = 1; i < 20; i++) {
    for (int j = 0; j < m; j++) {
      val[i][j] =
          seg[i - 1].query(1, 0, m - 1, val[i - 1][j].l, val[i - 1][j].r);
    }
    seg[i].build(1, 0, m - 1, val[i]);
  }
  for (int i = 0; i < n; i++) {
    range cur = {i + n, i + n};
    int ans = 1;
    for (int j = 19; j >= 0; j--) {
      range nxt = seg[j].query(1, 0, m - 1, cur.l, cur.r);
      if (nxt.r - nxt.l + 1 < n) {
        cur = nxt;
        ans += 1 << j;
      }
    }
    cout << ans << " \n"[i + 1 == n];
  }
  return 0;
}
