#include <bits/stdc++.h>
using namespace std;
const int M = 3e5 + 10, Log = 20;
int n, r[M];
int lp[Log][M], rp[Log][M];
struct node {
  int l, r;
  node() {}
  node(int a, int b) : l(a), r(b) {}
  friend node operator+(const node &a, const node &b) {
    return node(min(a.l, b.l), max(a.r, b.r));
  }
};
struct Segment_tree {
  int id;
  node S[M << 2];
  void pushup(int o) { S[o] = S[o << 1] + S[o << 1 | 1]; }
  void build(int o, int l, int r) {
    if (l == r) {
      S[o] = node(lp[id][l], rp[id][l]);
      return;
    }
    int mid = l + r >> 1;
    build(o << 1, l, mid);
    build(o << 1 | 1, mid + 1, r);
    pushup(o);
  }
  node query(int o, int l, int r, int L, int R) {
    if (L <= l && r <= R) {
      return S[o];
    }
    int mid = l + r >> 1;
    if (R <= mid)
      return query(o << 1, l, mid, L, R);
    else if (L > mid)
      return query(o << 1 | 1, mid + 1, r, L, R);
    else
      return query(o << 1, l, mid, L, R) + query(o << 1 | 1, mid + 1, r, L, R);
  }
} S[20];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &r[i]);
    r[i + n] = r[i];
    r[i + (n << 1)] = r[i];
  }
  if (n == 1) {
    puts("0");
    return 0;
  }
  int up = n * 3, tot = 0;
  for (int i = 0; (1 << i) <= up; i++, ++tot) S[i].id = i;
  --tot;
  for (int i = 1; i <= up; i++) {
    lp[0][i] = max(0, i - r[i]);
    rp[0][i] = min(up, i + r[i]);
  }
  node ask, now;
  S[0].build(1, 1, up);
  for (int i = 1; i <= tot; i++) {
    for (int j = 1; j <= up; j++) {
      ask = S[i - 1].query(1, 1, up, lp[i - 1][j], rp[i - 1][j]);
      lp[i][j] = ask.l;
      rp[i][j] = ask.r;
    }
    S[i].build(1, 1, up);
  }
  for (int i = n + 1, ans; i <= n + n; i++) {
    ans = 1;
    ask.l = i;
    ask.r = i;
    for (int j = tot; j >= 0; j--) {
      now = S[j].query(1, 1, up, ask.l, ask.r);
      if (now.r - now.l + 1 < n) {
        ask = ask + now;
        ans += (1 << j);
      }
    }
    printf("%d ", ans);
  }
  return 0;
}
