package main
import (
"fmt"
)
func query(r1, c1, r2, c2 int) int {
fmt.Printf("? %d %d %d %d\n", r1, c1, r2, c2)
var ans int
fmt.Scan(&ans)
return ans
}
func main() {
var n int
fmt.Scan(&n)
odd_rows := []int{}
for i := 1; i < n; i++ {
ans := query(i, 1, i, n)
if ans%2 != 0 {
odd_rows = append(odd_rows, i)
if len(odd_rows) == 2 {
break
}
}
}
if len(odd_rows) == 1 {
odd_rows = append(odd_rows, n)
}
if len(odd_rows) == 2 {
r1 := odd_rows[0]
r2 := odd_rows[1]
low1, high1 := 1, n
for low1 < high1 {
mid := (low1 + high1) / 2
if query(r1, 1, r1, mid)%2 != 0 {
high1 = mid
} else {
low1 = mid + 1
}
}
c1 := low1
low2, high2 := 1, n
for low2 < high2 {
mid := (low2 + high2) / 2
if query(r2, 1, r2, mid)%2 != 0 {
high2 = mid
} else {
low2 = mid + 1
}
}
c2 := low2
fmt.Printf("! %d %d %d %d\n", r1, c1, r2, c2)
return
}
odd_cols := []int{}
for i := 1; i < n; i++ {
ans := query(1, i, n, i)
if ans%2 != 0 {
odd_cols = append(odd_cols, i)
if len(odd_cols) == 2 {
break
}
}
}
if len(odd_cols) == 1 {
odd_cols = append(odd_cols, n)
}
c1 := odd_cols[0]
c2 := odd_cols[1]
low, high := 1, n
for low < high {
mid := (low + high) / 2
if query(1, c1, mid, c1)%2 != 0 {
high = mid
} else {
low = mid + 1
}
}
r := low
fmt.Printf("! %d %d %d %d\n", r, c1, r, c2)
}