/** @KUTBILIMONE **/
#include <bits/stdc++.h>

using namespace std;

const int N = (2e5 + 10);

int t[N * 4];
int lazy[N * 4], tsize;

void push(int v, int vl, int vr) {
   if (t[v] > 0)
      t[v] += lazy[v];
   if (vl != vr) {
      lazy[2 * v + 1] += lazy[v];
      lazy[2 * v + 2] += lazy[v];
   }
   lazy[v] =  0;
}

void add(int l, int r, int val, int v, int vl, int vr) {
   push(v, vl, vr);
   if (l > vr || vl > r)
      return;
   if (l <= vl && vr <= r) {
      lazy[v] += val;
      push(v, vl, vr);
      return;
   }
   int vm = (vl + vr) / 2;
   add(l, r, val, 2 * v + 1, vl, vm);
   add(l, r, val, 2 * v + 2, vm + 1, vr);
   t[v] = max(t[2 * v + 1], t[2 * v + 2]);
}

void update(int pos, int val, int v, int vl, int vr) {
   push(v, vl, vr);
   if (vl == vr) {
      t[v] = val;
      return;
   }
   int vm = (vl + vr) / 2;
   if (pos <= vm)
      update(pos, val, 2 * v + 1, vl, vm);
   else
      update(pos, val, 2 * v + 2, vm + 1, vr);
   t[v] = max(t[2 * v + 1], t[2 * v + 2]);
}

int get(int pos, int v, int vl, int vr) {
   push(v, vl, vr);
   if (vl == vr)
      return t[v];
   int vm = (vl + vr) / 2;
   if (pos <= vm)
      return get(pos, 2 * v + 1, vl, vm);
   else
      return get(pos, 2 * v + 2, vm + 1, vr);
}

int ask(int mid, int n){
   int g = get(mid, 0, 1, n);
   if (g > 0) {
      return g;
   }
   int res;
   cout << "? " << 1 << " " << mid << endl;
   cin >> res;
   update(mid, res, 0, 1, n);
   return res;
}

int main() {
   int n, t;
   cin >> n >> t;
   tsize = n;
   while (t--) {
      int k;
      cin >> k;

      int l = 1, r = n;
      while (l < r) {
         int mid = (l + r) / 2;
         int pref = ask(mid, n);
         pref = mid - pref;
         if (pref < k)
            l = mid + 1;
         else if (k <= pref)
            r = mid;
      }

      add(r, n, 1, 0, 1, n);

      cout << "! " << r << endl;
   }

   return 0;
}
