For problem statement at 0-999/500-599/580-589/587/problemC.txt this is a correct solution, but verifier at 0-999/500-599/580-589/587/verifierC.go ends with All tests passed can you fix the verifier? ```go
package main
import (
"fmt"
"math"
"sort"
"strings"
)
const LOG = 18
var adj [][]int
var people [][]int
var depth []int
var up [][]int
var sz []int
var heavy []int
var chainIdx []int
var posInChain []int
var chainHeads []int
var chainLists [][]int
var segTrees [][][]int
func dfsSize(node, par, dep int) {
depth[node] = dep
up[node][0] = par
sz[node] = 1
maxChild := -1
heavy[node] = -1
for _, child := range adj[node] {
if child != par {
dfsSize(child, node, dep+1)
sz[node] += sz[child]
if sz[child] > maxChild {
maxChild = sz[child]
heavy[node] = child
}
}
}
}
func dfsHLD(node, par, chn int) {
chainIdx[node] = chn
posInChain[node] = len(chainLists[chn])
chainLists[chn] = append(chainLists[chn], node)
if heavy[node] != -1 {
dfsHLD(heavy[node], node, chn)
}
for _, child := range adj[node] {
if child != par && child != heavy[node] {
newchn := len(chainLists)
chainLists = append(chainLists, []int{})
chainHeads = append(chainHeads, child)
dfsHLD(child, node, newchn)
}
}
}
func build(chn, node, start, end int) {
if start == end {
nd := chainLists[chn][start]
segTrees[chn][node] = make([]int, len(people[nd]))
copy(segTrees[chn][node], people[nd])
return
}
mid := (start + end) / 2
build(chn, 2*node, start, mid)
build(chn, 2*node+1, mid+1, end)
left := segTrees[chn][2*node]
right := segTrees[chn][2*node+1]
merged := make([]int, len(left)+len(right))
i, j, k := 0, 0, 0
for i < len(left) && j < len(right) {
if left[i] < right[j] {
merged[k] = left[i]
i++
} else {
merged[k] = right[j]
j++
}
k++
}
copy(merged[k:], left[i:])
k += len(left) - i
copy(merged[k:], right[j:])
segTrees[chn][node] = merged
}
func querySeg(chn, node, start, end, l, r int) [][]int {
if r < start || end < l {
return [][]int{}
}
if l <= start && end <= r {
return [][]int{segTrees[chn][node]}
}
mid := (start + end) / 2
lef := querySeg(chn, 2*node, start, mid, l, r)
rig := querySeg(chn, 2*node+1, mid+1, end, l, r)
return append(lef, rig...)
}
func getLCA(a, b int) int {
if depth[a] > depth[b] {
a, b = b, a
}
diff := depth[b] - depth[a]
for j := 0; j < LOG; j++ {
if (diff & (1 << j)) != 0 {
b = up[b][j]
}
}
if a == b {
return a
}
for j := LOG - 1; j >= 0; j-- {
if up[a][j] != up[b][j] {
a = up[a][j]
b = up[b][j]
}
}
return up[a][0]
}
func climb(from, to int, include bool) [][]int {
var vecs [][]int
cur := from
for chainIdx[cur] != chainIdx[to] {
ch := chainIdx[cur]
hpos := posInChain[chainHeads[ch]]
cpos := posInChain[cur]
q := querySeg(ch, 1, 0, len(chainLists[ch])-1, hpos, cpos)
vecs = append(vecs, q...)
cur = up[chainHeads[ch]][0]
}
ch := chainIdx[cur]
tpos := posInChain[to]
cpos := posInChain[cur]
startpos := tpos
if !include {
startpos = tpos + 1
}
if startpos <= cpos {
q := querySeg(ch, 1, 0, len(chainLists[ch])-1, startpos, cpos)
vecs = append(vecs, q...)
}
return vecs
}
func getPathVectors(v, u int) [][]int {
lca := getLCA(v, u)
var vecs [][]int
if v == lca {
vecs = climb(u, lca, true)
} else if u == lca {
vecs = climb(v, lca, true)
} else {
vvec := climb(v, lca, true)
uvec := climb(u, lca, false)
vecs = append(vvec, uvec...)
}
return vecs
}
func main() {
var n, m, q int
fmt.Scan(&n, &m, &q)
adj = make([][]int, n+1)
for i := 0; i < n-1; i++ {
var a, b int
fmt.Scan(&a, &b)
adj[a] = append(adj[a], b)
adj[b] = append(adj[b], a)
}
people = make([][]int, n+1)
for i := 1; i <= m; i++ {
var ci int
fmt.Scan(&ci)
people[ci] = append(people[ci], i)
}
for i := 1; i <= n; i++ {
sort.Ints(people[i])
}
depth = make([]int, n+1)
sz = make([]int, n+1)
heavy = make([]int, n+1)
for i := range heavy {
heavy[i] = -1
}
up = make([][]int, n+1)
for i := range up {
up[i] = make([]int, LOG)
}
dfsSize(1, 0, 0)
for j := 1; j < LOG; j++ {
for i := 1; i <= n; i++ {
if up[i][j-1] != 0 {
up[i][j] = up[up[i][j-1]][j-1]
}
}
}
chainIdx = make([]int, n+1)
posInChain = make([]int, n+1)
chainLists = make([][]int, 1)
chainLists[0] = []int{}
chainHeads = make([]int, 1)
chainHeads[0] = 1
dfsHLD(1, 0, 0)
segTrees = make([][][]int, len(chainLists))
for chn := 0; chn < len(chainLists); chn++ {
csz := len(chainLists[chn])
if csz == 0 {
continue
}
segTrees[chn] = make([][]int, 4*csz)
build(chn, 1, 0, csz-1)
}
var out strings.Builder
for qi := 0; qi < q; qi++ {
var v, u, a int
fmt.Scan(&v, &u, &a)
vecs := getPathVectors(v, u)
currPos := make([]int, len(vecs))
result := []int{}
for len(result) < a {
minVal := math.MaxInt32
minLi := -1
for li := 0; li < len(vecs); li++ {
if currPos[li] < len(vecs[li]) && vecs[li][currPos[li]] < minVal {
minVal = vecs[li][currPos[li]]
minLi = li
}
}
if minLi == -1 {
break
}
result = append(result, minVal)
currPos[minLi]++
}
out.WriteString(fmt.Sprintf("%d", len(result)))
for _, p := range result {
out.WriteString(fmt.Sprintf(" %d", p))
}
out.WriteString("\n")
}
fmt.Print(out.String())
}
```