← Home
For problem statement at 1000-1999/1300-1399/1360-1369/1363/problemD.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1360-1369/1363/verifierD.go ends with Problem D is interactive and cannot be automatically verified. can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

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

	scanner.Scan()
	t, _ := strconv.Atoi(scanner.Text())

	for tc := 0; tc < t; tc++ {
		scanner.Scan()
		parts := strings.Fields(scanner.Text())
		n, _ := strconv.Atoi(parts[0])
		k, _ := strconv.Atoi(parts[1])

		sets := make([][]int, k)
		present := make([]bool, n+1)

		for i := 0; i < k; i++ {
			scanner.Scan()
			line := strings.Fields(scanner.Text())
			c, _ := strconv.Atoi(line[0])
			sets[i] = make([]int, c)
			for j := 0; j < c; j++ {
				idx, _ := strconv.Atoi(line[j+1])
				sets[i][j] = idx
				present[idx] = true
			}
		}

		var rSet []int
		for i := 1; i <= n; i++ {
			if !present[i] {
				rSet = append(rSet, i)
			}
		}

		query := func(indices []int) int {
			fmt.Fprintf(writer, "? %d", len(indices))
			for _, idx := range indices {
				fmt.Fprintf(writer, " %d", idx)
			}
			fmt.Fprintln(writer)
			writer.Flush()
			scanner.Scan()
			val, _ := strconv.Atoi(scanner.Text())
			return val
		}

		allIndices := make([]int, n)
		for i := 0; i < n; i++ {
			allIndices[i] = i + 1
		}
		M := query(allIndices)

		var searchSets [][]int
		for i := 0; i < k; i++ {
			searchSets = append(searchSets, sets[i])
		}
		hasR := len(rSet) > 0
		if hasR {
			searchSets = append(searchSets, rSet)
		}

		m := len(searchSets)
		left, right := 0, m-1
		for left < right {
			mid := (left + right) / 2
			var union []int
			for i := left; i <= mid; i++ {
				union = append(union, searchSets[i]...)
			}
			isInUnion := make([]bool, n+1)
			for _, idx := range union {
				isInUnion[idx] = true
			}
			complement := make([]int, 0, n-len(union))
			for i := 1; i <= n; i++ {
				if !isInUnion[i] {
					complement = append(complement, i)
				}
			}
			val := query(complement)
			if val < M {
				right = mid
			} else {
				left = mid + 1
			}
		}

		idx := left
		if hasR && idx == m-1 {
			fmt.Fprintf(writer, "!")
			for i := 0; i < k; i++ {
				fmt.Fprintf(writer, " %d", M)
			}
			fmt.Fprintln(writer)
			writer.Flush()
		} else {
			isInSet := make([]bool, n+1)
			for _, x := range searchSets[idx] {
				isInSet[x] = true
			}
			complement := make([]int, 0, n-len(searchSets[idx]))
			for i := 1; i <= n; i++ {
				if !isInSet[i] {
					complement = append(complement, i)
				}
			}
			val := query(complement)
			if val == M {
				fmt.Fprintf(writer, "!")
				for i := 0; i < k; i++ {
					fmt.Fprintf(writer, " %d", M)
				}
				fmt.Fprintln(writer)
				writer.Flush()
			} else {
				fmt.Fprintf(writer, "!")
				for i := 0; i < k; i++ {
					if i == idx {
						fmt.Fprintf(writer, " %d", val)
					} else {
						fmt.Fprintf(writer, " %d", M)
					}
				}
				fmt.Fprintln(writer)
				writer.Flush()
			}
		}

		scanner.Scan()
	}
}
```