← Home
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? package main

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

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

type Item struct {
	cnt uint8
	a   [10]int32
}

func merge(x, y Item) Item {
	var z Item
	i, j := 0, 0
	cx, cy := int(x.cnt), int(y.cnt)
	for z.cnt < 10 && (i < cx || j < cy) {
		if j >= cy || (i < cx && x.a[i] < y.a[j]) {
			z.a[z.cnt] = x.a[i]
			i++
		} else {
			z.a[z.cnt] = y.a[j]
			j++
		}
		z.cnt++
	}
	return z
}

func lca(u, v int, up [][]int, depth []int) int {
	if depth[u] < depth[v] {
		u, v = v, u
	}
	diff := depth[u] - depth[v]
	k := 0
	for diff > 0 {
		if diff&1 == 1 {
			u = up[k][u]
		}
		diff >>= 1
		k++
	}
	if u == v {
		return u
	}
	for k = len(up) - 1; k >= 0; k-- {
		if up[k][u] != up[k][v] {
			u = up[k][u]
			v = up[k][v]
		}
	}
	return up[0][u]
}

func collect(v, dist int, up [][]int, best [][]Item) Item {
	var res Item
	k := 0
	for dist > 0 {
		if dist&1 == 1 {
			res = merge(res, best[k][v])
			v = up[k][v]
		}
		dist >>= 1
		k++
	}
	return res
}

func appendInt(dst []byte, x int) []byte {
	return strconv.AppendInt(dst, int64(x), 10)
}

func main() {
	fs := NewFastScanner()

	n := fs.NextInt()
	m := fs.NextInt()
	q := fs.NextInt()

	head := make([]int, n+1)
	for i := 1; i <= n; i++ {
		head[i] = -1
	}
	to := make([]int, 2*(n-1))
	nxt := make([]int, 2*(n-1))
	ei := 0

	for i := 0; i < n-1; i++ {
		v := fs.NextInt()
		u := fs.NextInt()

		to[ei] = u
		nxt[ei] = head[v]
		head[v] = ei
		ei++

		to[ei] = v
		nxt[ei] = head[u]
		head[u] = ei
		ei++
	}

	log := 0
	for (1 << log) <= n {
		log++
	}

	up := make([][]int, log)
	best := make([][]Item, log)
	up[0] = make([]int, n+1)
	best[0] = make([]Item, n+1)

	for id := 1; id <= m; id++ {
		c := fs.NextInt()
		if best[0][c].cnt < 10 {
			best[0][c].a[best[0][c].cnt] = int32(id)
			best[0][c].cnt++
		}
	}

	depth := make([]int, n+1)
	stack := make([]int, 1, n)
	stack[0] = 1

	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		for e := head[v]; e != -1; e = nxt[e] {
			u := to[e]
			if u != up[0][v] {
				up[0][u] = v
				depth[u] = depth[v] + 1
				stack = append(stack, u)
			}
		}
	}

	for k := 1; k < log; k++ {
		up[k] = make([]int, n+1)
		best[k] = make([]Item, n+1)
		pu := up[k-1]
		pb := best[k-1]
		cu := up[k]
		cb := best[k]
		for v := 1; v <= n; v++ {
			mid := pu[v]
			if mid != 0 {
				cu[v] = pu[mid]
				cb[v] = merge(pb[v], pb[mid])
			} else {
				cb[v] = pb[v]
			}
		}
	}

	out := make([]byte, 0, q*48)

	for i := 0; i < q; i++ {
		v := fs.NextInt()
		u := fs.NextInt()
		a := fs.NextInt()

		w := lca(v, u, up, depth)
		res := merge(collect(v, depth[v]-depth[w], up, best), collect(u, depth[u]-depth[w], up, best))
		res = merge(res, best[0][w])

		k := int(res.cnt)
		if k > a {
			k = a
		}

		out = appendInt(out, k)
		for j := 0; j < k; j++ {
			out = append(out, ' ')
			out = appendInt(out, int(res.a[j]))
		}
		out = append(out, '\n')
	}

	os.Stdout.Write(out)
}