#include<bits/stdc++.h>
using namespace std;
#define M 500000
typedef long long ll;
typedef unsigned long long ull;
void q(ll x,ll y) {
	cout << '?' << ' ' << x << ' ' << y << endl;
	cout.flush();
}
void out(ll x) {
	cout << '!' << ' ' << x << endl;
	cout.flush();
}
ll ed;
ll tree[M];
inline ll lowBit(ll x){return x&(-x);}
ll query(ll x) {
	ll res = 0;
	while (x > 0) {
		res += tree[x];
		x -= lowBit(x);
	}
	return res;
}
void update(ll x,ll v) {
	while (x <= ed) {
		tree[x] += v;
		x += lowBit(x);
	}
}
int main() {
	//freopen("../in", "r", stdin);
	//freopen("../out", "w", stdout);
	ll n, k;
	ll t;
	ll cc;
	cin >> n >> k;
	cin >> cc;
	ed = n / 20 + 1;
	for (ll i = 1; i <= n; i += 20) {
		q(i, min(i + 19, n));
		cin >> t;
		t = min(i + 19, n) - i + 1 - t;
		update(i / 20 + 1, t);
	}
	while (k--) {
		ll left = 1, right = ed;
		ll ans = ed;
		while (left <= right) {
			ll mid = (left + right) >> 1;
			if (query(mid) >= cc) {
				ans = mid;
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		update(ans, -1);
		cc -= query(ans - 1);
		left = ans * 20 - 19;
		right = min(ans * 20, n);
		ll z=left;
		while (left <= right) {
			ll mid = (left + right) >> 1;
			q(z, mid);
			cin >> t;
			t = (mid - z + 1) - t;
			if (t >= cc) {
				ans = mid;
				right = mid - 1;
			}
			else {
				left = mid + 1;
			}
		}
		out(ans);
		if (k == 0)
			break;
		cin >> cc;
	}
	return 0;
}