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()
}
```