```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
query := func(l, r int) int {
fmt.Fprintf(out, "? %d %d\n", l, r)
out.Flush()
var x int
if _, err := fmt.Fscan(in, &x); err != nil || x == -1 {
os.Exit(0)
}
return x
}
answer := func(pos int) {
fmt.Fprintf(out, "! %d\n", pos)
out.Flush()
}
s := query(1, n)
if s == 1 {
l, r := 2, n
for l < r {
m := (l + r) / 2
if query(s, m) == s {
r = m
} else {
l = m + 1
}
}
answer(l)
return
}
if s == n {
l, r := 1, n-1
for l < r {
m := (l + r + 1) / 2
if query(m, s) == s {
l = m
} else {
r = m - 1
}
}
answer(l)
return
}
if query(1, s) == s {
l, r := 1, s-1
for l < r {
m := (l + r + 1) / 2
if query(m, s) == s {
l = m
} else {
r = m - 1
}
}
answer(l)
} else {
l, r := s+1, n
for l < r {
m := (l + r) / 2
if query(s, m) == s {
r = m
} else {
l = m + 1
}
}
answer(l)
}
}
```