// {{{ by unolight
#include <bits/stdc++.h>
#pragma GCC diagnostic ignored "-Wunused-result"
#pragma GCC diagnostic ignored "-Wunused-function"
#define SZ(x) ((int)(x).size())
#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define REP1(i,a,b) for (int i = a; i <= (int)(b); i++)
#define ALL(c) (c).begin(), (c).end()
#define RALL(c) (c).rbegin(), (c).rend()
#define PB push_back
#define MP make_pair
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;

namespace { namespace unolight {

#ifdef UNOLIGHT
#include "dump.hpp"
#else
#define dump(...)
#endif

template<class T> inline bool chmax( T &a, const T &b ) { return b>a ? a=b,true : false; }
template<class T> inline bool chmin( T &a, const T &b ) { return b<a ? a=b,true : false; }
template <class T, class F = less<T>>
void sort_uniq(vector<T> &v, F f = F()) {
    sort(begin(v), end(v), f);
    v.resize(unique(begin(v), end(v)) - begin(v));
}
// }}}

// {{{ 1-indexed BIT
template<class T>
struct BIT {
    int n;
    vector<T> bit;
    BIT( int n_ ):n(n_+1), bit(n_+1, 0) {}
    void init() { fill(bit.begin(), bit.end(), 0); }
    void add( int k, T v ) {
        for(;k<n; k+=k&-k) bit[k] += v;
    }
    T get( int k ) {
        T r=0;
        for(;k>0;k-=k&-k) r+=bit[k];
        return r;
    }
    // [l, r]
    T get( int l, int r ) {
        return get(r)-get(l-1);
    }
    T operator[]( int i ) { return get(i,i); }
};
// }}}

BIT<int> bit(200010);
int memo[200010];
void main() {
    int n,t;
    cin>>n>>t;
    memset(memo,-1,sizeof(memo));
    auto Ask=[&]( int r ) -> int {
        int x;
        if ( memo[r]!=-1 ) {
            x=memo[r]+bit.get(r);
        } else {
            cout<<"? 1 "<<r<<'\n';
            cout.flush();
            cin>>x;
            memo[r]=x-bit.get(r);
        }
        return x;
    };
    auto Answer=[&]( int ans ) -> void {
        cout<<"! "<<ans<<'\n';
        cout.flush();
    };
    while ( t-- ) {
        int k;
        cin>>k;
        if ( k==-1 ) break;
        int l=0,r=n;
        while ( r-l>1 ) {
            int m=(l+r)/2;
            int res=Ask(m);
            if ( m-res>=k ) r=m;
            else l=m;
        }
        Answer(r);
        bit.add(r,1);
    }
}

// {{{ main
}}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    unolight::main();
    return 0;
}
// }}}