#include <bits/stdc++.h>
#define lc (o<<1)
#define rc ((o<<1)|1)
#define PB push_back
#define MK make_pair
using namespace std;
#define DebugP(x) //cout << "Line" << __LINE__ << " " << #x << "=" << x << endl

const int maxn = 2e5 + 5;
const int modu = 1e9 + 7; // 1e9 + 7
const int inf = 0x3f3f3f3f;
const double eps = 1e-5;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

typedef long long LL;

void read(LL &x) {
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return;
}

void read(int &x) { LL y; read(y); x = (int)y; }
void read(char &ch) { char s[3]; scanf("%s", s); ch = s[0]; }
void read(char *s) { scanf("%s", s); }
template<class T, class ...U> void read(T &x, U& ... u) { read(x); read(u...); }

int n, m, cnt = 0;
int vis[1005];
int ansr, ansc;

int query(int h, int w, int i1, int j1, int i2, int j2) {
	cnt++;
	printf("? %d %d %d %d %d %d\n", h, w, i1, j1, i2, j2);
	fflush(stdout);
	int t;
	scanf("%d", &t);
	return t;
}

int solver(int tot, int d) {
	while (tot > d) {
		int k = tot / d; tot = (k/2+k%2)*d;
		if (query(k/2*d, m, 1, 1, (k/2+k%2)*d+1, 1) == 0) {
			return 0;
		}
	}
	return 1;
}

int solvec(int tot, int d) {
	while (tot > d) {
		int k = tot / d; tot = (k/2+k%2)*d;
		if (query(n, k/2*d, 1, 1, 1, (k/2+k%2)*d+1) == 0) {
			return 0;
		}
	}
	return 1;
}

int gcd(int a, int b) {
	int t;
	while (b) {
		t = a;
		a = b;
		b = t%b;
	}
	return a;
}

int main() {
    // freopen("my.txt", "w", stdout);
    scanf("%d%d", &n, &m);
	memset(vis, -1, sizeof(vis));
	ansr = ansc = 0;
	vis[n] = 1;
	for (int i = n-1; i >= 1; --i) if (n % i == 0) {
		int k = n;
		for (int j = i*2; j <= n; j += i)
			if (n % j == 0) {
				if (vis[j] == 0) {
					k = 0;
					break;
				}
				k = gcd(k, j);
			}
		if (k == 0) vis[i] = 0;
		else if (k == i) vis[i] = 1;
		else if (vis[k] == 1) vis[i] = solver(k, i);
		else vis[i] = 0;
	}
	for (int i = 1; i <= n; ++i) ansr += (vis[i] == 1);

	memset(vis, -1, sizeof(vis));
	vis[m] = 1;
	for (int i = m-1; i >= 1; --i) if (m % i == 0) {
		int k = m;
		for (int j = i*2; j <= m; j += i)
			if (m % j == 0) {
				if (vis[j] == 0) {
					k = 0;
					break;
				}
				k = gcd(k, j);
			}
		if (k == 0) vis[i] = 0;
		else if (k == i) vis[i] = 1;
		else if (vis[k] == 1) vis[i] = solvec(k, i);
		else vis[i] = 0;
	}
	for (int i = 1; i <= m; ++i) ansc += (vis[i] == 1);
	DebugP(cnt);
	printf("! %d\n", ansr*ansc);
	fflush(stdout);
	return 0;
}