← Home
```go
package main

import (
	"bufio"
	"os"
)

var scanner *bufio.Scanner

func init() {
	scanner = bufio.NewScanner(os.Stdin)
	scanner.Buffer(make([]byte, 1024*1024), 1024*1024*10)
	scanner.Split(bufio.ScanWords)
}

func readInt() int {
	scanner.Scan()
	b := scanner.Bytes()
	res := 0
	for _, v := range b {
		res = res*10 + int(v-'0')
	}
	return res
}

func writeInt(w *bufio.Writer, n int) {
	if n == 0 {
		w.WriteByte('0')
		return
	}
	var buf [20]byte
	i := len(buf)
	for n > 0 {
		i--
		buf[i] = byte('0' + n%10)
		n /= 10
	}
	w.Write(buf[i:])
}

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

	if !scanner.Scan() {
		return
	}
	b := scanner.Bytes()
	t := 0
	for _, v := range b {
		t = t*10 + int(v-'0')
	}

	for test := 0; test < t; test++ {
		n := readInt()
		parent := make([]int, n+1)
		for i := 2; i <= n; i++ {
			parent[i] = readInt()
		}

		sz := make([]int, n+1)
		for i := 1; i <= n; i++ {
			sz[i] = 1
		}
		heavy_child := make([]int, n+1)

		for i := n; i >= 2; i-- {
			p := parent[i]
			sz[p] += sz[i]
			if heavy_child[p] == 0 || sz[i] > sz[heavy_child[p]] {
				heavy_child[p] = i
			}
		}

		degree := make([]int, n+1)
		for i := 2; i <= n; i++ {
			degree[parent[i]]++
		}
		adj := make([][]int, n+1)
		for i := 1; i <= n; i++ {
			adj[i] = make([]int, 0, degree[i])
		}
		for i := 2; i <= n; i++ {
			adj[parent[i]] = append(adj[parent[i]], i)
		}

		head := make([]int, n+1)
		in := make([]int, n+1)
		outTime := make([]int, n+1)

		type State struct {
			u, edgeIdx int
		}
		stack := make([]State, 0, n)
		stack = append(stack, State{1, 0})
		head[1] = 1
		timer := 0

		for len(stack) > 0 {
			curr := &stack[len(stack)-1]
			u := curr.u
			if curr.edgeIdx == 0 {
				timer++
				in[u] = timer
			}

			if curr.edgeIdx < len(adj[u]) {
				v := adj[u][curr.edgeIdx]
				curr.edgeIdx++

				if v == heavy_child[u] {
					head[v] = head[u]
				} else {
					head[v] = v
				}
				stack = append(stack, State{v, 0})
			} else {
				outTime[u] = timer
				stack = stack[:len(stack)-1]
			}
		}

		fenwick := make([]int, n+2)
		add := func(i, delta int) {
			for ; i < len(fenwick); i += i & -i {
				fenwick[i] += delta
			}
		}
		query := func(i int) int {
			s := 0
			for ; i > 0; i -= i & -i {
				s += fenwick[i]
			}
			return s
		}
		queryRange := func(l, r int) int {
			if l > r {
				return 0
			}
			return query(r) - query(l-1)
		}

		light_max := make([]int, n+1)
		c := 1
		S := 1
		add(in[1], 1)

		ans := make([]int, 0, n-1)

		for u := 2; u <= n; u++ {
			curr := u
			for curr != 0 {
				t_node := head[curr]
				p := parent[t_node]
				if p != 0 {
					new_val := queryRange(in[t_node], outTime[t_node]) + 1
					if new_val > light_max[p] {
						light_max[p] = new_val
					}
				}
				curr = p
			}

			add(in[u], 1)
			S++

			if in[c] <= in[u] && in[u] <= outTime[c] {
				curr_u := u
				var v int
				found := false
				for head[curr_u] != head[c] {
					if parent[head[curr_u]] == c {
						v = head[curr_u]
						found = true
						break
					}
					curr_u = parent[head[curr_u]]
				}
				if !found {
					v = heavy_child[c]
				}

				if queryRange(in[v], outTime[v]) > S/2 {
					c = v
				}
			} else {
				v := parent[c]
				if S-queryRange(in[c], outTime[c]) > S/2 {
					c = v
				}
			}

			max_branch := 0
			hc := heavy_child[c]
			if hc != 0 {
				hc_sz := queryRange(in[hc], outTime[hc])
				if hc_sz > max_branch {
					max_branch = hc_sz
				}
			}
			if light_max[c] > max_branch {
				max_branch = light_max[c]
			}
			if parent[c] != 0 {
				p_sz := S - queryRange(in[c], outTime[c])
				if p_sz > max_branch {
					max_branch = p_sz
				}
			}

			ans = append(ans, S-2*max_branch)
		}

		for i, val := range ans {
			if i > 0 {
				out.WriteByte(' ')
			}
			writeInt(out, val)
		}
		out.WriteByte('\n')
	}
}
```