#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;   }   