#include <iostream>
#include <vector>

using namespace std;

//ifstream cin ("colonii.in");
//ofstream cout ("colonii.out");

int n, m;
vector <int> d;

bool Query_linie(int nr, int lg, int dr) {
  bool ans = true;
  if (lg == 1 && dr > 3)  {
    if (nr & 1) {
      cout << "? " << dr / 2 << ' ' << m << " 1 1 " << dr / 2 + 1 << ' ' << 1 << endl;
      cin >> ans;
      if (!ans)
        return false;
      cout << "? " << dr / 2 << ' ' << m << " 1 1 " << dr / 2 + 2 << ' ' << 1 << endl;
      cin >> ans;
      return ans;
    }
  }
  if (nr == 1)
    return true;
  if ((nr & 1) || nr == 2)  {
    cout << "? " << lg << ' ' << m << " 1 1 " << dr - lg + 1 << ' ' << 1 << endl;
    cin >> ans;
    dr -= lg;
  }
  if (!ans)
    return false;
  if (nr > 2) {
    cout << "? " << dr / 2 << ' ' << m << " 1 1 " << dr / 2 + 1 << ' ' << 1 << endl;
    cin >> ans;
    if (!ans)
      return false;
    return Query_linie(nr / 2, lg, dr / 2);
  }
  return true;
}

bool Query_coloana(int nr, int lg, int dr) {
  bool ans = true;
  if (lg == 1 && dr > 3)  {
    if (nr & 1) {
      cout << "? " << n << ' ' << dr / 2 << " 1 1 " << 1 << ' ' << dr / 2 + 1 << endl;
      cin >> ans;
      if (!ans)
        return false;
      cout << "? " << n << ' ' << dr / 2 << " 1 1 " << 1 << ' ' << dr / 2 + 2 << endl;
      cin >> ans;
      return ans;
    }
  }
  if (nr == 1)
    return true;
  if ((nr & 1) || nr == 2)  {
    cout << "? " << n << ' ' << lg << " 1 1 " << 1 << ' ' << dr - lg + 1 << endl;
    cin >> ans;
    dr -= lg;
  }
  if (!ans)
    return false;
  if (nr > 2) {
    cout << "? " << n << ' ' << dr / 2 << " 1 1 " << 1 << ' ' << dr / 2 + 1 << endl;
    cin >> ans;
    if (!ans)
      return false;
    return Query_coloana(nr / 2, lg, dr / 2);
  }
  return true;
}

void solve()  {
  for (int i = d.size() - 1; i >= 0; --i) {
    if (Query_linie(d[i], n / d[i], n)) {
      n /= d[i];
    }
  }
}

void solve2() {
  for (int i = d.size() - 1; i >= 0; --i) {
//    cout << d[i] << '\n';
    if (Query_coloana(d[i], m / d[i], m)) {
      m /= d[i];
    }
  }
}

void generez_divizori(int x) {
  d.clear();
  for (int i = 2; i * i <= x; ++i)  {
    while (x % i == 0) {
      d.push_back(i);
      x /= i;
    }
  }
  if (x > 1)
    d.push_back(x);
}

int nrdiv(int x)  {
  int ans = 1;
  if (x != 1)
    ++ans;
  for (int i = 2; i * i <= x; ++i)  {
    if (x % i == 0) {
      ++ans;
      if (x / i != i)
        ++ans;
    }
  }
  return ans;
}

int main()  {
  cin >> n >> m;
  int r = n, c = m;
  generez_divizori(n);
  solve();
  generez_divizori(m);
  solve2();
  cout << "! " << nrdiv(r / n) * nrdiv(c / m) << endl;
	return 0;
}
