← Home
For problem statement at 0-999/700-799/710-719/713/problemB.txt this is a correct solution, but verifier at 0-999/700-799/710-719/713/verifierB.go ends with case 1 failed: wrong answer: expected [2 1 2 2] [1 4 5 5] got [1 1 2 2] [5 4 5 5]
rect1:[2 1 2 2] rect2:[1 4 5 5] n:12
exit status 1 can you fix the verifier? ```go
package main

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

type Rect struct {
	x1, y1, x2, y2 int
}

var in = bufio.NewReader(os.Stdin)
var out = bufio.NewWriter(os.Stdout)

func ask(x1, y1, x2, y2 int) int {
	if x1 > x2 || y1 > y2 {
		return 0
	}
	fmt.Fprintf(out, "? %d %d %d %d\n", x1, y1, x2, y2)
	out.Flush()
	var ans int
	_, err := fmt.Fscan(in, &ans)
	if err != nil {
		os.Exit(0)
	}
	if ans < 0 {
		os.Exit(0)
	}
	return ans
}

func contains(r Rect, x1, y1, x2, y2 int) bool {
	return r.x1 >= x1 && r.y1 >= y1 && r.x2 <= x2 && r.y2 <= y2
}

func findRectByX2(n int, x2 int, query func(int, int, int, int) int) Rect {
	lo, hi := 1, x2
	x1 := x2
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(mid, 1, x2, n) >= 1 {
			x1 = mid
			hi = mid - 1
		} else {
			lo = mid + 1
		}
	}
	lo, hi = 1, n
	y2 := n
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(1, 1, x2, mid) >= 1 {
			y2 = mid
			hi = mid - 1
		} else {
			lo = mid + 1
		}
	}
	lo, hi = 1, n
	y1 := 1
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(1, mid, x2, n) >= 1 {
			y1 = mid
			lo = mid + 1
		} else {
			hi = mid - 1
		}
	}
	return Rect{x1, y1, x2, y2}
}

func findRectByY2(n int, y2 int, query func(int, int, int, int) int) Rect {
	lo, hi := 1, y2
	y1 := y2
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(1, mid, n, y2) >= 1 {
			y1 = mid
			hi = mid - 1
		} else {
			lo = mid + 1
		}
	}
	lo, hi = 1, n
	x2 := n
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(1, 1, mid, y2) >= 1 {
			x2 = mid
			hi = mid - 1
		} else {
			lo = mid + 1
		}
	}
	lo, hi = 1, n
	x1 := 1
	for lo <= hi {
		mid := (lo + hi) >> 1
		if query(mid, 1, n, y2) >= 1 {
			x1 = mid
			lo = mid + 1
		} else {
			hi = mid - 1
		}
	}
	return Rect{x1, y1, x2, y2}
}

func main() {
	defer out.Flush()
	var n int
	fmt.Fscan(in, &n)

	findMinX2 := func(query func(int, int, int, int) int) int {
		lo, hi := 1, n
		res := n
		for lo <= hi {
			mid := (lo + hi) >> 1
			if query(1, 1, mid, n) >= 1 {
				res = mid
				hi = mid - 1
			} else {
				lo = mid + 1
			}
		}
		return res
	}
	findMinY2 := func(query func(int, int, int, int) int) int {
		lo, hi := 1, n
		res := n
		for lo <= hi {
			mid := (lo + hi) >> 1
			if query(1, 1, n, mid) >= 1 {
				res = mid
				hi = mid - 1
			} else {
				lo = mid + 1
			}
		}
		return res
	}

	q := func(x1, y1, x2, y2 int) int { return ask(x1, y1, x2, y2) }

	x2A := findMinX2(q)
	c := ask(1, 1, x2A, n)
	var A Rect
	if c == 1 {
		A = findRectByX2(n, x2A, q)
	} else {
		y2A := findMinY2(q)
		A = findRectByY2(n, y2A, q)
	}

	q2 := func(x1, y1, x2, y2 int) int {
		ans := ask(x1, y1, x2, y2)
		if contains(A, x1, y1, x2, y2) {
			ans--
		}
		return ans
	}

	x2B := findMinX2(q2)
	B := findRectByX2(n, x2B, q2)

	fmt.Fprintf(out, "! %d %d %d %d %d %d %d %d\n", A.x1, A.y1, A.x2, A.y2, B.x1, B.y1, B.x2, B.y2)
	out.Flush()
}
```