#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
//#define endl '\n'

/* ------- */

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3fLL;
//const int MOD = 998244353;

//ll qpow(ll x, ll n, ll m = MOD) {
////    assert(m > 1 and n >= 0);
////    if (x < 0 or x > m) x = (x % m + m) % m;
//    ll res = 1;
//    for (; n; n >>= 1, x = x * x % m)
//        if (n & 1) res = res * x % m;
//    return res;
//}

template<typename T>
void cmin(T &x, T y) {
    if (y < x) x = y;
}

template<typename T>
void cmax(T &x, T y) {
    if (y > x) x = y;
}



void purin_init() {
}

int n, t, k;
char a[200005];

int ask2(int l, int r) {
    cout << "? " << l << " " << r << endl;
    fflush(stdout);
    int res = 0;
    cin >> res;
    return res;
}

static const int MAXN = 2e5 + 10;

int sum[MAXN << 2];
bool vis[MAXN << 2];

struct SegmentTree {

#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l + r) >> 1)


    int Sum(int u, int l, int r) {
        if (vis[u]) return sum[u];
        vis[u] = 1;
        return sum[u] = ask2(l, r);
    }

    void iFlip(int u, int l, int r, int pos) {
        if (l > r || pos < l || pos > r) return;
        assert(vis[u]);
        ++sum[u];
        if (l != r) {
            iFlip(ls, l, mid, pos);
            iFlip(rs, mid + 1, r, pos);
        }
    }

    int iPos(int u, int l, int r, int k) {
        Sum(u, l, r);
        assert(k <= r - l + 1 - sum[u]);
        if (l == r) {
            assert(sum[u] == 0);
            return l;
        } else {
            if (mid - l + 1 - Sum(ls, l, mid) >= k)
                return iPos(ls, l, mid, k);
            else {
                k -= mid - l + 1 - sum[ls];
                vis[rs] = 1;
                sum[rs] = sum[u] - sum[ls];
                return iPos(rs, mid + 1, r, k);
            }
        }
    }

#undef ls
#undef rs
#undef mid

} tree;

void purin_solve() {
//    cin >> (a + 1);
    cin >> n >> t;
    int x = -1;
    while (t--) {
        cin >> k;
        if (x != -1) tree.iFlip(1, 1, n, x);
        x = tree.iPos(1, 1, n, k);
        cout << "! " << x << endl;
        fflush(stdout);
    }
}

int main() {
#ifdef LOCAL
//    freopen ("A.in", "r", stdin);
#endif // LOCAL
//    ios::sync_with_stdio(false);
//    cin.tie(nullptr), cout.tie(nullptr);
    cout << fixed << setprecision(9);
//    int T;
//    cin >> T;
    purin_init();
    purin_solve();
    return 0;
}
