← Home
For problem statement at 1000-1999/1000-1099/1000-1009/1009/problemF.txt this is a correct solution, but verifier at 1000-1999/1000-1099/1000-1009/1009/verifierF.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

type Node struct {
	maxv int
	pos  int
}

var (
	n        int
	adj      [][]int
	depth    []int
	sz       []int
	dominant []int
	tree     []Node
	N        int
)

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func build(idx, l, r int) {
	if l == r {
		tree[idx] = Node{0, l}
		return
	}
	mid := (l + r) / 2
	build(2*idx, l, mid)
	build(2*idx+1, mid+1, r)
	left := tree[2*idx]
	right := tree[2*idx+1]
	if left.maxv > right.maxv {
		tree[idx] = left
	} else if left.maxv < right.maxv {
		tree[idx] = right
	} else {
		tree[idx] = Node{left.maxv, min(left.pos, right.pos)}
	}
}

func update(idx, l, r, p, delta int) {
	if l == r {
		tree[idx].maxv += delta
		return
	}
	mid := (l + r) / 2
	if p <= mid {
		update(2*idx, l, mid, p, delta)
	} else {
		update(2*idx+1, mid+1, r, p, delta)
	}
	left := tree[2*idx]
	right := tree[2*idx+1]
	if left.maxv > right.maxv {
		tree[idx] = left
	} else if left.maxv < right.maxv {
		tree[idx] = right
	} else {
		tree[idx] = Node{left.maxv, min(left.pos, right.pos)}
	}
}

func add_node(u int) {
	update(1, 0, N, depth[u], 1)
}

func remove_node(u int) {
	update(1, 0, N, depth[u], -1)
}

func add_subtree(u, par int) {
	add_node(u)
	for _, v := range adj[u] {
		if v != par {
			add_subtree(v, u)
		}
	}
}

func remove_subtree(u, par int) {
	remove_node(u)
	for _, v := range adj[u] {
		if v != par {
			remove_subtree(v, u)
		}
	}
}

func dfs_size(u, p int) {
	sz[u] = 1
	if u == 1 {
		depth[u] = 0
	} else {
		depth[u] = depth[p] + 1
	}
	for _, v := range adj[u] {
		if v != p {
			dfs_size(v, u)
			sz[u] += sz[v]
		}
	}
}

func dfs_keep(u, par int, keep bool) {
	heavy := -1
	max_cs := -1
	for _, v := range adj[u] {
		if v != par && sz[v] > max_cs {
			max_cs = sz[v]
			heavy = v
		}
	}
	for _, v := range adj[u] {
		if v != par && v != heavy {
			dfs_keep(v, u, false)
		}
	}
	if heavy != -1 {
		dfs_keep(heavy, u, true)
	}
	for _, v := range adj[u] {
		if v != par && v != heavy {
			add_subtree(v, u)
		}
	}
	add_node(u)
	dom := tree[1].pos - depth[u]
	dominant[u] = dom
	if !keep {
		remove_subtree(u, par)
	}
}

func main() {
	in := bufio.NewReader(os.Stdin)
	fmt.Fscan(in, &n)
	adj = make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var x, y int
		fmt.Fscan(in, &x, &y)
		adj[x] = append(adj[x], y)
		adj[y] = append(adj[y], x)
	}
	depth = make([]int, n+1)
	sz = make([]int, n+1)
	dominant = make([]int, n+1)
	dfs_size(1, 0)
	N = n
	tree = make([]Node, 4*(N+1))
	build(1, 0, N)
	dfs_keep(1, 0, true)
	out := bufio.NewWriter(os.Stdout)
	for i := 1; i <= n; i++ {
		fmt.Fprint(out, dominant[i], " ")
	}
	fmt.Fprintln(out)
	out.Flush()
}
```