#include <bits/stdc++.h>
using namespace std;
const long long LM = 1LL << 60;
template <typename T>
void _smawk(const vector<int> &rows, const vector<int> &cols,
            const function<T(int, int)> &lookup, vector<int> *result) {
  if (rows.size() == 0) return;
  vector<int> _cols;
  for (int col : cols) {
    while (true) {
      if (_cols.size() == 0) break;
      int row = rows[_cols.size() - 1];
      if (lookup(row, col) >= lookup(row, _cols.back())) break;
      _cols.pop_back();
    }
    if (_cols.size() < rows.size()) _cols.push_back(col);
  }
  vector<int> odd_rows;
  for (int i = 1; i < rows.size(); i += 2) {
    odd_rows.push_back(rows[i]);
  }
  _smawk(odd_rows, _cols, lookup, result);
  unordered_map<int, int> col_idx_lookup;
  for (int idx = 0; idx < _cols.size(); ++idx) {
    col_idx_lookup[_cols[idx]] = idx;
  }
  int start = 0;
  for (int r = 0; r < rows.size(); r += 2) {
    int row = rows[r];
    int stop = _cols.size() - 1;
    if (r < rows.size() - 1) stop = col_idx_lookup[(*result)[rows[r + 1]]];
    int argmin = _cols[start];
    T min = lookup(row, argmin);
    for (int c = start + 1; c <= stop; ++c) {
      T value = lookup(row, _cols[c]);
      if (c == start || value < min) {
        argmin = _cols[c];
        min = value;
      }
    }
    (*result)[row] = argmin;
    start = stop;
  }
}
template <typename T>
vector<int> smawk(const int num_rows, const int num_cols,
                  const function<T(int, int)> &lookup) {
  vector<int> result;
  result.resize(num_rows);
  vector<int> rows(num_rows);
  iota(begin(rows), end(rows), 0);
  vector<int> cols(num_cols);
  iota(begin(cols), end(cols), 0);
  _smawk<T>(rows, cols, lookup, &result);
  return result;
}
int mi = 1000000007;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  int h, w;
  cin >> h >> w;
  auto lookup = [](int i, int j) {
    cout << "? " << i + 1 << ' ' << j + 1 << endl;
    int res;
    cin >> res;
    mi = min(mi, res);
    return res;
  };
  vector<int> argmin = smawk<double>(h, w, lookup);
  cout << "! " << mi << '\n';
  return 0;
}
