func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   inline T read(register T& t) {     register T f = 1;     register char ch = getchar();     t = 0;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -f;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) t = t * 10 + ch -  0 , ch = getchar();     t *= f;     return t;   }   template <typename T, typename... Args>   inline void read(T& t, Args&... args) {     read(t);     read(args...);   }   const long long p = 998244353;   inline long long power(register long long x, register long long k = p - 2) {     register long long re = 1;     for (; k; k >>= 1, x = x * x % p)       if (k & 1) re = re * x % p;     return re;   }   int n;   int a[300005];   struct ST {     int lg[300005];     int val[300005];     int st[300005][20];     inline int Max(int x, int y) {       if (val[x] < val[y]) return y;       return x;     }     ST() {       lg[1] = 0;       for (int i = 2; i <= 300000; i++) lg[i] = lg[i >> 1] + 1;     }     void build(int* x, int n, int type) {       for (int i = 1; i <= n; i++) val[i] = x[i] * type;       for (int i = 1; i <= n; i++) st[i][0] = i;       for (int i = 1; i < 20; i++)         for (int j = 1; j + (1 << i) - 1 <= n; j++)           st[j][i] = Max(st[j][i - 1], st[j + (1 << i - 1)][i - 1]);     }     inline int ask(int l, int r) {       int len = lg[r - l + 1];       return Max(st[l][len], st[r - (1 << len) + 1][len]);     }   } L0, R0;   int l_lim[300005], r_lim[300005];   int l[300005][20], r[300005][20];   int main() {     read(n);     if (n == 1) return printf( 0 ), 0;     for (int i = 1; i <= n; i++) read(a[i]), a[n + i] = a[n + n + i] = a[i];     for (int i = 1; i <= n * 3; i++)       l_lim[i] = max(1, i - a[i]), r_lim[i] = min(n * 3, i + a[i]);     L0.build(l_lim, n * 3, -1);     R0.build(r_lim, n * 3, 1);     for (int i = 1; i <= n * 3; i++) l[i][0] = l_lim[i], r[i][0] = r_lim[i];     for (int i = 1; i < 20; i++)       for (int j = 1; j <= n * 3; j++) {         int L = L0.ask(l[j][i - 1], r[j][i - 1]);         int R = R0.ask(l[j][i - 1], r[j][i - 1]);         l[j][i] = min(l[L][i - 1], l[R][i - 1]);         r[j][i] = max(r[L][i - 1], r[R][i - 1]);       }     for (int i = n + 1; i <= n + n; i++) {       int ans = 0;       int x = i, y = i;       for (int j = 20 - 1; j >= 0; j--) {         if (max(r[x][j], r[y][j]) - min(l[x][j], l[y][j]) + 1 >= n) continue;         int tx = x, ty = y;         x = L0.ask(l[tx][j], r[ty][j]);         y = R0.ask(l[tx][j], r[ty][j]);         ans += (1 << j);       }       printf( %d  , ans + 1);     }     return 0;   }   