← Home
```go
package main

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

func readInt(r *bufio.Reader) int {
	var n int
	var sign int = 1
	for {
		c, err := r.ReadByte()
		if err != nil {
			return 0
		}
		if c == '-' {
			sign = -1
			break
		}
		if c >= '0' && c <= '9' {
			n = int(c - '0')
			break
		}
	}
	for {
		c, err := r.ReadByte()
		if err != nil || c < '0' || c > '9' {
			break
		}
		n = n*10 + int(c-'0')
	}
	return n * sign
}

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

	n := readInt(reader)
	t := readInt(reader)

	origZeros := make([]int, n+1)
	for i := range origZeros {
		origZeros[i] = -1
	}

	bit := make([]int, n+1)
	add := func(idx, val int) {
		for ; idx <= n; idx += idx & -idx {
			bit[idx] += val
		}
	}
	queryBIT := func(idx int) int {
		sum := 0
		for ; idx > 0; idx -= idx & -idx {
			sum += bit[idx]
		}
		return sum
	}

	for i := 0; i < t; i++ {
		k := readInt(reader)

		left, right := 1, n
		for left < right {
			mid := (left + right) / 2
			
			if origZeros[mid] == -1 {
				fmt.Fprintf(writer, "? 1 %d\n", mid)
				writer.Flush()
				
				sum := readInt(reader)
				if sum == -1 {
					return
				}
				origZeros[mid] = mid - sum
			}
			
			curZeros := origZeros[mid] - queryBIT(mid)
			
			if curZeros >= k {
				right = mid
			} else {
				left = mid + 1
			}
		}
		
		fmt.Fprintf(writer, "! %d\n", left)
		writer.Flush()
		add(left, 1)
	}
}
```