#include <bits/stdc++.h>
using namespace std;
struct SegmentTree {
  int n;
  vector<int> mn, mx;
  void init(int sz) {
    n = 1;
    while (n < sz) n <<= 1;
    mn.assign(2 * n, 1987654321);
    mx.assign(2 * n, -1);
  }
  void updateMin(int p, int val) {
    p += n - 1;
    mn[p] = min(mn[p], val);
    for (p >>= 1; p; p >>= 1) mn[p] = min(mn[2 * p], mn[2 * p + 1]);
  }
  void updateMax(int p, int val) {
    p += n - 1;
    mx[p] = max(mx[p], val);
    for (p >>= 1; p; p >>= 1) mx[p] = max(mx[2 * p], mx[2 * p + 1]);
  }
  int rangeMin(int l, int r) {
    int res = 1987654321;
    for (l += n - 1, r += n - 1; l <= r; l >>= 1, r >>= 1) {
      if (l & 1) res = min(res, mn[l++]);
      if (!(r & 1)) res = min(res, mn[r--]);
    }
    return res;
  }
  int rangeMax(int l, int r) {
    int res = -1;
    for (l += n - 1, r += n - 1; l <= r; l >>= 1, r >>= 1) {
      if (l & 1) res = max(res, mx[l++]);
      if (!(r & 1)) res = max(res, mx[r--]);
    }
    return res;
  }
  int getMin(int p) { return mn[p + (n - 1)]; }
  int getMax(int p) { return mx[p + (n - 1)]; }
};
const int MAXN = 1e5 + 50;
const int LOGN = 18;
int r[MAXN];
int n;
void readInput() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &r[i]);
  for (int i = 1; i <= n; i++)
    if (r[i] == n) r[i]--;
}
int findMin(int l, int r, SegmentTree &tree) {
  int res = 1987654321;
  res = min(res, tree.rangeMin(max(l, 1), min(r, n)) - n);
  res = min(res, tree.rangeMin(max(l, n + 1) - n, min(r, 2 * n) - n));
  res = min(
      res, tree.rangeMin(max(l, 2 * n + 1) - 2 * n, min(r, 3 * n) - 2 * n) + n);
  return res;
}
int findMax(int l, int r, SegmentTree &tree) {
  int res = -1;
  res = max(res, tree.rangeMax(max(l, 1), min(r, n)) - n);
  res = max(res, tree.rangeMax(max(l, n + 1) - n, min(r, 2 * n) - n));
  res = max(
      res, tree.rangeMax(max(l, 2 * n + 1) - 2 * n, min(r, 3 * n) - 2 * n) + n);
  return res;
}
SegmentTree st[LOGN];
pair<int, int> findNext(int l, int r, int k) {
  int nl = findMin(l, r, st[k]);
  int nr = findMax(l, r, st[k]);
  if (nr - nl >= n - 1) return {1, n};
  if (nl <= 0) {
    nl += n - 1;
    nr += n - 1;
  }
  return {nl, nr};
}
void findST() {
  for (int i = 0; i < LOGN; i++) st[i].init(n);
  for (int i = 1; i <= n; i++) {
    st[0].updateMin(i, n + i - r[i]);
    st[0].updateMax(i, min(st[0].getMin(i) + n - 1, n + i + r[i]));
  }
  for (int k = 1; k < LOGN; k++) {
    for (int i = 1; i <= n; i++) {
      int cl = st[k - 1].getMin(i), cr = st[k - 1].getMax(i);
      pair<int, int> p = findNext(cl, cr, k - 1);
      st[k].updateMin(i, p.first);
      st[k].updateMax(i, p.second);
    }
  }
}
int solve(int x) {
  int res = n - 1, cur = 0;
  int cl = n + x, cr = n + x;
  for (int k = LOGN - 1; k >= 0; k--) {
    pair<int, int> p = findNext(cl, cr, k);
    if (p.second - p.first >= n - 1) {
      res = min(res, cur + (1 << k));
    } else {
      cur += (1 << k);
      cl = p.first;
      cr = p.second;
    }
  }
  return res;
}
int main() {
  readInput();
  findST();
  for (int i = 1; i <= n; i++) printf("%d ", solve(i));
}
