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

template <typename T>
struct Ftree { /* {{{ */
    vector<T> bit;
    Ftree(int _n) { bit.assign(_n + 1, 0); }

    void update(int x, T val) {
        for (++x; x < (int)bit.size(); x += x&-x) 
            bit[x] += val;
    }

    T query(int x) {
        T ret = 0;
        for (++x; x > 0; x -= x&-x) ret += bit[x];
        return ret;
    }
}; /* }}} */

int lim = 6e4;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n, t;
    cin >> n >> t;

    auto qry = [&](int l, int r) {
        --lim;
        if (lim < 0) {
            assert(0);
        }

        cout << "? " << l + 1 << " " << r + 1 << endl;
        int ret;
        cin >> ret;

        return ret;
    };
    
    int bn = (n + 9) / 10;
    Ftree<int> bit(bn);

    for (int tc = 0; tc < t; ++tc) {
        int k;
        cin >> k;

        if (tc == 0) {
            for (int j = 0; j < n; j += 10) {
                int l = j, r = min(n - 1, j + 9);
                bit.update(j / 10, r - l + 1 - qry(l, r));
            }
        }

        int l = 0, r = bn - 1;
        while (l < r) {
            int mid = (l + r) / 2;
            int val = bit.query(mid);
            if (val < k) l = mid + 1;
            else r = mid;
        }
        
        if (l) k -= bit.query(l - 1);
        l = l * 10, r = min(n - 1, l + 9);

        while (l < r) {
            int mid = (l + r) / 2;
            int val = mid - l + 1 - qry(l, mid);
            if (val >= k) r = mid;
            else {
                k -= val;
                l = mid + 1;
            }
        }
            
        cout << "! " << l + 1 << endl;
        bit.update(l / 10, -1);
    }
}
