← Home
package main

import (
	"io"
	"os"
	"strconv"
)

const LOG = 20

func add(bit []int, i, v int) {
	for i < len(bit) {
		bit[i] += v
		i += i & -i
	}
}

func sum(bit []int, i int) int {
	res := 0
	for i > 0 {
		res += bit[i]
		i -= i & -i
	}
	return res
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		x := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			x = x*10 + int(data[p]-'0')
			p++
		}
		return x
	}

	t := nextInt()
	out := make([]byte, 0, 1<<20)

	for ; t > 0; t-- {
		n := nextInt()

		head := make([]int, n+1)
		to := make([]int, n)
		nxt := make([]int, n)
		parent := make([]int, n+1)
		depth := make([]int, n+1)

		upFlat := make([]int, LOG*(n+1))
		up := make([][]int, LOG)
		for i := 0; i < LOG; i++ {
			up[i] = upFlat[i*(n+1) : (i+1)*(n+1)]
		}

		for v := 2; v <= n; v++ {
			par := nextInt()
			parent[v] = par
			depth[v] = depth[par] + 1
			up[0][v] = par
			for j := 1; j < LOG; j++ {
				up[j][v] = up[j-1][up[j-1][v]]
			}
			e := v - 1
			to[e] = v
			nxt[e] = head[par]
			head[par] = e
		}

		tin := make([]int, n+1)
		tout := make([]int, n+1)
		stackV := make([]int, n+1)
		stackE := make([]int, n+1)

		timer := 1
		tin[1] = 1
		top := 0
		stackV[0] = 1
		stackE[0] = head[1]

		for top >= 0 {
			v := stackV[top]
			e := stackE[top]
			if e != 0 {
				stackE[top] = nxt[e]
				u := to[e]
				timer++
				tin[u] = timer
				top++
				stackV[top] = u
				stackE[top] = head[u]
			} else {
				tout[v] = timer
				top--
			}
		}

		bit := make([]int, n+2)
		add(bit, tin[1], 1)

		centroid := 1
		ans := 1
		m := 1

		for x := 2; x <= n; x++ {
			add(bit, tin[x], 1)
			m++

			var sAfter, nextC int

			if tin[centroid] <= tin[x] && tout[x] <= tout[centroid] {
				u := x
				k := depth[x] - depth[centroid] - 1
				b := 0
				for k > 0 {
					if k&1 == 1 {
						u = up[b][u]
					}
					k >>= 1
					b++
				}
				nextC = u
				sAfter = sum(bit, tout[u]) - sum(bit, tin[u]-1)
			} else {
				nextC = parent[centroid]
				sc := sum(bit, tout[centroid]) - sum(bit, tin[centroid]-1)
				sAfter = m - sc
			}

			oldAns := ans
			if oldAns == 0 {
				ans = 1
			} else {
				L := ((m - 1) - oldAns) / 2
				if sAfter == L+1 {
					ans = oldAns - 1
				} else {
					ans = oldAns + 1
				}
			}

			if sAfter > m/2 {
				centroid = nextC
			}

			out = strconv.AppendInt(out, int64(ans), 10)
			if x == n {
				out = append(out, '\n')
			} else {
				out = append(out, ' ')
			}
		}
	}

	os.Stdout.Write(out)
}