← Home
```go
package main

import (
	"bufio"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	nextInt := func() int {
		scanner.Scan()
		val, _ := strconv.Atoi(scanner.Text())
		return val
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	if n == 1 {
		nextInt()
		out := bufio.NewWriter(os.Stdout)
		out.WriteString("0\n")
		out.Flush()
		return
	}

	r := make([]int32, n)
	for i := 0; i < n; i++ {
		r[i] = int32(nextInt())
	}

	N := 3 * n
	var L [18][]int32
	var R [18][]int32
	for i := 0; i < 18; i++ {
		L[i] = make([]int32, N)
		R[i] = make([]int32, N)
	}

	var st_min [19][]int32
	var st_max [19][]int32
	for i := 0; i < 19; i++ {
		st_min[i] = make([]int32, N)
		st_max[i] = make([]int32, N)
	}

	log2 := make([]int32, N+1)
	log2[1] = 0
	for i := 2; i <= N; i++ {
		log2[i] = log2[i/2] + 1
	}

	for i := 0; i < N; i++ {
		L[0][i] = int32(i) - r[i%n]
		if L[0][i] < 0 {
			L[0][i] = 0
		}
		R[0][i] = int32(i) + r[i%n]
		if R[0][i] >= int32(N) {
			R[0][i] = int32(N - 1)
		}
	}

	for p := 1; p < 18; p++ {
		for i := 0; i < N; i++ {
			st_min[0][i] = L[p-1][i]
			st_max[0][i] = R[p-1][i]
		}
		for j := 1; (1 << j) <= N; j++ {
			for i := 0; i+(1<<j) <= N; i++ {
				a := st_min[j-1][i]
				b := st_min[j-1][i+(1<<(j-1))]
				if a < b {
					st_min[j][i] = a
				} else {
					st_min[j][i] = b
				}

				c := st_max[j-1][i]
				d := st_max[j-1][i+(1<<(j-1))]
				if c > d {
					st_max[j][i] = c
				} else {
					st_max[j][i] = d
				}
			}
		}

		for i := 0; i < N; i++ {
			l := L[p-1][i]
			ri := R[p-1][i]
			k := log2[ri-l+1]

			a := st_min[k][l]
			b := st_min[k][ri-(1<<k)+1]
			if a < b {
				L[p][i] = a
			} else {
				L[p][i] = b
			}

			c := st_max[k][l]
			d := st_max[k][ri-(1<<k)+1]
			if c > d {
				R[p][i] = c
			} else {
				R[p][i] = d
			}
		}
	}

	curL := make([]int32, n)
	curR := make([]int32, n)
	ans := make([]int32, n)
	for i := 0; i < n; i++ {
		curL[i] = int32(i + n)
		curR[i] = int32(i + n)
		ans[i] = 0
	}

	for p := 17; p >= 0; p-- {
		for i := 0; i < N; i++ {
			st_min[0][i] = L[p][i]
			st_max[0][i] = R[p][i]
		}
		for j := 1; (1 << j) <= N; j++ {
			for i := 0; i+(1<<j) <= N; i++ {
				a := st_min[j-1][i]
				b := st_min[j-1][i+(1<<(j-1))]
				if a < b {
					st_min[j][i] = a
				} else {
					st_min[j][i] = b
				}

				c := st_max[j-1][i]
				d := st_max[j-1][i+(1<<(j-1))]
				if c > d {
					st_max[j][i] = c
				} else {
					st_max[j][i] = d
				}
			}
		}

		for i := 0; i < n; i++ {
			l := curL[i]
			ri := curR[i]
			k := log2[ri-l+1]

			a := st_min[k][l]
			b := st_min[k][ri-(1<<k)+1]
			nextL := a
			if b < a {
				nextL = b
			}

			c := st_max[k][l]
			d := st_max[k][ri-(1<<k)+1]
			nextR := c
			if d > c {
				nextR = d
			}

			if nextR-nextL < int32(n-1) {
				curL[i] = nextL
				curR[i] = nextR
				ans[i] += 1 << p
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 0; i < n; i++ {
		out.WriteString(strconv.Itoa(int(ans[i] + 1)))
		if i != n-1 {
			out.WriteByte(' ')
		}
	}
	out.WriteByte('\n')
	out.Flush()
}
```