← Home
For problem statement at 1000-1999/1700-1799/1770-1779/1773/problemH.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1770-1779/1773/verifierH.go ends with case 6 failed (treasure at 123456 654321): query 27 out of bounds: -500000 705766
exit status 1 can you fix the verifier? ```go
package main

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

var (
	reader  *bufio.Reader
	writer  *bufio.Writer
	queries int
	S       = 1000000
)

func query(x, y int) string {
	fmt.Fprintf(writer, "%d %d\n", x, y)
	writer.Flush()
	queries++
	resp, _ := reader.ReadString('\n')
	resp = strings.TrimSpace(resp)
	if strings.HasSuffix(resp, "!") {
		os.Exit(0)
	}
	return resp
}

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

	query(0, 0)
	samePhrase := query(0, 0)

	var closerPhrase, furtherPhrase string

	r1 := query(1, 0)
	r2 := query(2, 0)

	if r1 != samePhrase && r2 != samePhrase && r1 != r2 {
		closerPhrase = r1
		furtherPhrase = r2
	} else {
		r3 := query(S, 0)
		r4 := query(S-1, 0)
		r5 := query(S-2, 0)

		if r4 != samePhrase && r5 != samePhrase && r4 != r5 {
			closerPhrase = r4
			furtherPhrase = r5
		} else if r1 == r4 && r1 != samePhrase {
			closerPhrase = r1
			if r3 == r1 {
				furtherPhrase = r2 
			} else {
				furtherPhrase = r3
			}
		} else {
			ry1 := query(0, 1)
			ry2 := query(0, 2)
			if ry1 != samePhrase && ry2 != samePhrase && ry1 != ry2 {
				closerPhrase = ry1
				furtherPhrase = ry2
			} else {
				ry3 := query(0, S)
				ry4 := query(0, S-1)
				ry5 := query(0, S-2)
				if ry4 != samePhrase && ry5 != samePhrase && ry4 != ry5 {
					closerPhrase = ry4
					furtherPhrase = ry5
				} else if ry1 == ry4 && ry1 != samePhrase {
					closerPhrase = ry1
					if ry3 == ry1 {
						furtherPhrase = ry2
					} else {
						furtherPhrase = ry3
					}
				} else {
					query(S, 0)
					query(0, S)
					query(S, S)
					os.Exit(0)
				}
			}
		}
	}

	if furtherPhrase == "" {
		if closerPhrase == r1 {
			furtherPhrase = r2
		} else {
			furtherPhrase = r1
		}
	}

	lx, rx := 0, S
	ly, ry := 0, S
	px, py := 0, 0
	query(px, py)

	for lx < rx || ly < ry {
		var qx, qy int
		canX := false
		if lx < rx {
			qx = lx + rx - px
			if qx >= 0 && qx <= S {
				canX = true
			}
		}

		var canY bool
		if ly < ry {
			qy = ly + ry - py
			if qy >= 0 && qy <= S {
				canY = true
			}
		}

		if canX {
			resp := query(qx, py)
			midX := (lx + rx) / 2
			if resp == samePhrase {
				lx, rx = midX, midX
			} else if resp == closerPhrase {
				if qx > px {
					lx = midX + 1
				} else {
					rx = midX
				}
			} else {
				if qx > px {
					rx = midX
				} else {
					lx = midX + 1
				}
			}
			px = qx
			continue
		}

		if canY {
			resp := query(px, qy)
			midY := (ly + ry) / 2
			if resp == samePhrase {
				ly, ry = midY, midY
			} else if resp == closerPhrase {
				if qy > py {
					ly = midY + 1
				} else {
					ry = midY
				}
			} else {
				if qy > py {
					ry = midY
				} else {
					ly = midY + 1
				}
			}
			py = qy
			continue
		}

		nx, ny := px, py
		if lx < rx {
			nx = lx + rx - px
		}
		if ly < ry {
			ny = ly + ry - py
		}
		query(nx, ny)
		px, py = nx, ny
	}

	query(lx, ly)
}
```