#include <cstdio>
#include <algorithm>
using namespace std;

const int N = (int)2e5;

class ST {
    int n;
    int dat[4*N+5];
    
    int upd(int idx, int l, int r, int a, int b, int val) {
        if (a <= l && r <= b) return dat[idx] += val;
        if (r <  a || b <  l) return dat[idx];
        
        int mid = (l + r) >> 1;
        int resa = upd(2*idx  , l  ,mid, a,b, val);
        int resb = upd(2*idx+1, mid+1,r, a,b, val);
        return dat[idx];
    }
    
    int que(int idx, int l, int r, int pos) {
        if (pos <= l && r <= pos) return dat[idx];
        if (r <  pos || pos <  l) return 0;
        
        int mid = (l + r) >> 1;
        int resa = que(2*idx  , l  ,mid, pos);
        int resb = que(2*idx+1, mid+1,r, pos);
        return dat[idx] + resa + resb;
    }
    
public:
    int reset(int _n) {
        for (int i=0; i<4*N+3; i++) {
            dat[i] = -1;
        }
        return n = _n;
    }
    
    int upd(int a, int b, int val) {
        return upd(1, 1,n, a,b, val);
    }
    int que(int pos) {
        return que(1, 1,n, pos);
    }
};


ST ds;

int ask(int a) {
    int q = ds.que(a);
    if (q >= 0) return q;
    
    printf("? 1 %d\n", a); fflush(stdout);
    int res; scanf("%d", &res); res = a - res;
    ds.upd(a,a, res - q);
    return res;
}

int answer(int a, int n) {
    printf("! %d\n", a); fflush(stdout);
    ds.upd(a, n, -1);
    return 0;
}

int main() {
    int n,q; scanf("%d %d", &n, &q);
    
    ds.reset(n);
    for (int qq=1; qq<=q; qq++) {
        int k; scanf("%d", &k);
        
        int res = n + 5;
        for (int lo=1,hi=n; lo<=hi; ) {
            int mid = (lo + hi) >> 1;
            
            int ret = ask(mid);
            if (ret < k) {
                lo = mid + 1;
            } else {
                hi = mid - 1;
                res = min(res, mid);
            }
        }
        answer(res, n);
    }
    return 0;
}
