← Home
For problem statement at 1000-1999/1100-1199/1170-1179/1174/problemF.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1170-1179/1174/verifierF.go ends with Problem F is interactive and cannot be automatically verified. can you fix the verifier? package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	fmt.Fscan(reader, &n)

	adj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	depth := make([]int, n+1)
	sz := make([]int, n+1)
	heavy := make([]int, n+1)

	var dfs func(int, int, int)
	dfs = func(u, p, d int) {
		depth[u] = d
		sz[u] = 1
		maxSub := 0
		for _, v := range adj[u] {
			if v != p {
				dfs(v, u, d+1)
				sz[u] += sz[v]
				if sz[v] > maxSub {
					maxSub = sz[v]
					heavy[u] = v
				}
			}
		}
	}
	dfs(1, 0, 0)

	queryD := func(u int) int {
		fmt.Fprintf(writer, "d %d\n", u)
		writer.Flush()
		var d int
		fmt.Fscan(reader, &d)
		return d
	}

	queryS := func(u int) int {
		fmt.Fprintf(writer, "s %d\n", u)
		writer.Flush()
		var s int
		fmt.Fscan(reader, &s)
		return s
	}

	D := queryD(1)
	u := 1

	for {
		if depth[u] == D {
			fmt.Fprintf(writer, "! %d\n", u)
			writer.Flush()
			return
		}

		b := u
		for heavy[b] != 0 {
			b = heavy[b]
		}

		Db := queryD(b)
		distUv := (depth[b] + D - 2*depth[u] - Db) / 2
		v := u
		for i := 0; i < distUv; i++ {
			v = heavy[v]
		}

		if depth[v] == D {
			fmt.Fprintf(writer, "! %d\n", v)
			writer.Flush()
			return
		}

		u = queryS(v)
	}
}