#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
unordered_map<int, int> f[N];
int n, m, k, ans, p[N], sx[N], sy[N];
inline int sol(int x, int y) {
  if (f[x].count(y)) return f[x][y];
  int t;
  printf("? %d %d\n", x, y), fflush(stdout), scanf("%d", &t);
  return f[x][y] = t;
}
inline vector<int> solve(int n, int m, vector<int>& x, vector<int>& y) {
  if (n >= m) {
    if (n == 1) {
      vector<int> z;
      z.resize(1), z[0] = 1;
      ans = min(ans, sol(x[0], y[0]));
      return z;
    } else {
      vector<int> a, b;
      for (int i = 0; i < n; i += 2) a.push_back(x[i]);
      for (int i = 0; i < m; i++) b.push_back(y[i]);
      vector<int> z = solve((n + 1) / 2, m, a, b), q;
      z.push_back(m);
      int k = 0;
      for (int i = 0; i < n; i++) {
        if (i % 2 == 0)
          q.push_back(z[k++]);
        else {
          int sum = 1000000001, pos = 0;
          for (int c = z[k - 1]; c <= z[k]; c++) {
            int g = sol(x[i], y[c - 1]);
            if (sum > g) sum = g, pos = c;
          }
          q.push_back(pos), ans = min(ans, sum);
        }
      }
      return q;
    }
  } else {
    int l = 1;
    sx[l] = 1, sy[l] = 1;
    for (int i = 2; i <= m; i++) {
      while (l > 0) {
        int a = sol(x[sx[l] - 1], y[sy[l] - 1]),
            b = sol(x[sx[l] - 1], y[i - 1]);
        if (a > b)
          l--;
        else
          break;
      }
      if (sx[l] != n) l++, sx[l] = sx[l - 1] + 1, sy[l] = i;
    }
    vector<int> a, b, w;
    for (int i = 0; i < n; i++) a.push_back(x[i]);
    for (int i = 1; i <= l; i++) b.push_back(y[sy[i] - 1]), w.push_back(sy[i]);
    vector<int> z = solve(n, l, a, b), q;
    for (int i = 0; i < w.size(); i++) p[i + 1] = w[i];
    for (int i = 0; i < z.size(); i++) q.push_back(p[z[i]]);
    return q;
  }
}
int main() {
  cin >> n >> m;
  vector<int> a, b;
  a.resize(n), b.resize(m), ans = 1000000000;
  for (int i = 0; i < n; i++) a[i] = i + 1;
  for (int i = 0; i < m; i++) b[i] = i + 1;
  solve(n, m, a, b);
  printf("! %d\n", ans);
  return 0;
}
