← Home
```go
package main

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

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

	var t int
	if _, err := fmt.Fscan(reader, &t); err != nil {
		return
	}

	for tc := 0; tc < t; tc++ {
		var n, q int
		fmt.Fscan(reader, &n, &q)

		maxR := make([]int, n+2)
		for i := 0; i < q; i++ {
			var l, r int
			fmt.Fscan(reader, &l, &r)
			if r > maxR[l] {
				maxR[l] = r
			}
		}

		for i := 1; i <= n; i++ {
			if maxR[i-1] > maxR[i] {
				maxR[i] = maxR[i-1]
			}
		}

		type pair struct {
			l, r int
		}
		memo := make(map[pair]int)

		query := func(l, r int) int {
			p := pair{l, r}
			if val, ok := memo[p]; ok {
				return val
			}
			fmt.Fprintf(writer, "? %d %d\n", l, r)
			writer.Flush()
			var res int
			fmt.Fscan(reader, &res)
			if res == -1 {
				os.Exit(0)
			}
			memo[p] = res
			return res
		}

		check := func(X int) bool {
			low := 1
			high := n
			for low < high {
				mid := low + (high-low+1)/2
				if query(mid, n) >= X {
					low = mid
				} else {
					high = mid - 1
				}
			}
			L := low

			low = L
			high = n
			for low < high {
				mid := low + (high-low)/2
				if query(1, mid) >= X {
					high = mid
				} else {
					low = mid + 1
				}
			}
			R := low

			return maxR[L] >= R
		}

		ansLow := 0
		ansHigh := n
		for ansLow < ansHigh {
			mid := ansLow + (ansHigh-ansLow+1)/2
			if check(mid) {
				ansLow = mid
			} else {
				ansHigh = mid - 1
			}
		}

		fmt.Fprintf(writer, "! %d\n", ansLow)
		writer.Flush()
	}
}
```