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