#include <bits/stdc++.h>
using namespace std;

constexpr int bucket_sz = 16;

int n, tests;
vector<int> amt;

int query(int a, int b) {
	b = min(b, n-1);
	cout << "? " << a+1 << " " << b+1 << endl;
	int res;
	cin >> res;
	return b-a+1 - res; // number of 0s
}

void output_ans(int x) {
	cout << "! " << x+1 << endl;
}

void find_interval(int st, int ed, int k) {
	ed = min(ed, n-1);
	// printf("- Starting search [%d, %d]\n", st+1, ed+1);
	while (st < ed) {
		int md = (st + ed) / 2;
		// printf("testing %d\n", md+1);
		if (int cur_amt = query(0, md); cur_amt >= k) ed = md;
		else st = md + 1;
	}
	output_ans(st);
}

void calc(int k, vector<int> &amt) {
	int cur_amt = 0;
	for (unsigned i = 0; i < amt.size(); i++) {
		cur_amt += amt[i];
		if (cur_amt >= k) {
			find_interval(i*bucket_sz, (i+1)*bucket_sz-1, k);
			amt[i]--;
			break;
		}
	}
}

int main() {
	cin >> n >> tests;

	int nxt_k;
	cin >> nxt_k;

	for (int i = 0; i < n; i += bucket_sz) {
		int cur_amt = query(i, i+bucket_sz-1);
		amt.push_back(cur_amt);
	}

	for (int test = 1; test <= tests; test++) {
		if (test > 1) cin >> nxt_k;
		calc(nxt_k, amt);
	}
}
