← Home
package main

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

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

	buffer := make([]byte, 1024*1024)
	scanner.Buffer(buffer, 1024*1024)

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

	up := make([][19]int, n+1)
	depth := make([]int, n+1)

	getLCA := func(a, b int) int {
		if depth[a] < depth[b] {
			a, b = b, a
		}
		diff := depth[a] - depth[b]
		for i := 0; diff > 0; i++ {
			if (diff & 1) != 0 {
				a = up[a][i]
			}
			diff >>= 1
		}
		if a == b {
			return a
		}
		for i := 18; i >= 0; i-- {
			if up[a][i] != up[b][i] {
				a = up[a][i]
				b = up[b][i]
			}
		}
		return up[a][0]
	}

	dist := func(a, b int) int {
		return depth[a] + depth[b] - 2*depth[getLCA(a, b)]
	}

	u, v := 1, 1
	D := 0

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for k := 2; k <= n; k++ {
		scanner.Scan()
		p, _ := strconv.Atoi(scanner.Text())

		depth[k] = depth[p] + 1
		up[k][0] = p
		for j := 1; j < 19; j++ {
			up[k][j] = up[up[k][j-1]][j-1]
		}

		du := dist(k, u)
		dv := dist(k, v)

		if du > D {
			v = k
			D = du
		} else if dv > D {
			u = k
			D = dv
		}

		if k > 2 {
			out.WriteByte(' ')
		}
		out.WriteString(strconv.Itoa(D))
	}
	out.WriteByte('\n')
}