← Home
For problem statement at 1000-1999/1600-1699/1610-1619/1617/problemD2.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1610-1619/1617/verifierD2.go ends with Problem D2 is interactive and cannot be automatically verified. can you fix the verifier? ```go
package main

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

var in = bufio.NewReaderSize(os.Stdin, 1<<20)
var out = bufio.NewWriterSize(os.Stdout, 1<<20)

func ask(a, b, c int) int {
	fmt.Fprintf(out, "? %d %d %d\n", a, b, c)
	out.Flush()
	var x int
	if _, err := fmt.Fscan(in, &x); err != nil || x == -1 {
		os.Exit(0)
	}
	return x
}

func answer(imps []int) {
	fmt.Fprintf(out, "! %d", len(imps))
	for _, v := range imps {
		fmt.Fprintf(out, " %d", v)
	}
	fmt.Fprintln(out)
	out.Flush()
}

func main() {
	defer out.Flush()

	var t int
	if _, err := fmt.Fscan(in, &t); err != nil {
		return
	}

	for ; t > 0; t-- {
		var n int
		if _, err := fmt.Fscan(in, &n); err != nil {
			return
		}

		m := n / 3
		typ := make([]int, m)
		g0, g1 := -1, -1

		for i := 0; i < m; i++ {
			a := 3*i + 1
			b := a + 1
			c := a + 2
			typ[i] = ask(a, b, c)
			if typ[i] == 0 && g0 == -1 {
				g0 = i
			}
			if typ[i] == 1 && g1 == -1 {
				g1 = i
			}
		}

		a1, a2, a3 := 3*g0+1, 3*g0+2, 3*g0+3
		b1, b2, b3 := 3*g1+1, 3*g1+2, 3*g1+3

		x1 := ask(a1, a2, b1)
		x2 := ask(a1, a2, b2)
		x3 := ask(a1, a2, b3)

		imp, crew := 0, 0

		if x1 == 1 {
			imp, crew = a3, b1
		} else if x2 == 1 {
			imp, crew = a3, b2
		} else if x3 == 1 {
			imp, crew = a3, b3
		} else {
			imp = a1
			y := ask(a1, b1, b2)
			if y == 1 {
				crew = b1
			} else {
				z := ask(a1, b1, b3)
				if z == 1 {
					crew = b1
				} else {
					crew = b2
				}
			}
		}

		isImp := make([]bool, n+1)

		for i := 0; i < m; i++ {
			x := 3*i + 1
			y := x + 1
			z := x + 2

			if typ[i] == 0 {
				p := ask(x, y, crew)
				q := ask(x, z, crew)
				if p == 0 {
					isImp[x] = true
					isImp[y] = true
					isImp[z] = q == 0
				} else {
					isImp[z] = true
					if q == 0 {
						isImp[x] = true
						isImp[y] = false
					} else {
						isImp[x] = false
						isImp[y] = true
					}
				}
			} else {
				p := ask(x, y, imp)
				q := ask(x, z, imp)
				if p == 1 {
					isImp[x] = false
					isImp[y] = false
					isImp[z] = q == 0
				} else {
					isImp[z] = false
					if q == 1 {
						isImp[x] = false
						isImp[y] = true
					} else {
						isImp[x] = true
						isImp[y] = false
					}
				}
			}
		}

		res := make([]int, 0)
		for i := 1; i <= n; i++ {
			if isImp[i] {
				res = append(res, i)
			}
		}

		answer(res)
	}
}
```