#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;

template <typename T>
void read(T &x) {
	T f=1;x=0;char s=getchar();
	while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
	while(s>='0'&&s<='9') {x=(x<<3)+(x<<1)+(s^'0');s=getchar();}
	x *= f;
}

template <typename T>
void write(T x , char s='\n') {
	if(!x) {putchar('0');putchar(s);return;}
	if(x<0) {putchar('-');x=-x;}
	T tmp[25]={},t=0;
	while(x) tmp[t ++] = x % 10 , x /= 10;
	while(t -- > 0) putchar(tmp[t] + '0');
	putchar(s);
}

int n , m;

bool Ask_Col(int x , bool pr , int P) {
	int fl = 0;
	if(pr) {
		if(x == 2) cout << "? " << n << " " << m / 2 << " 1 1 1 " <<  m / 2 + 1 << endl , cin >> fl; 
		else {
			int siz = (m - m / x) / 2;
			cout << "? " << n << " " << siz << " 1 1 1 " <<  m - siz + 1 << endl; 
			cin >> fl;
			if(!fl) return 0;
			cout << "? " << n << " " << siz << " 1 1 1 " <<  siz + 1 << endl; 
			cin >> fl;
		}
	}
	else {
		if(x % 2 == 0) cout << "? " << n << " " << m / x << " 1 1 1 " << m - m / x + 1 << endl , cin >> fl;
		else {
//			cout << "? " << n << " " << m / x + 1 << " 1 1 1 " << m - m / x << endl;
			int S = (m / (x / P)) , siz = (S - S / P) / 2;
			cout << "? " << n << " " << siz << " 1 1 1 " <<  m - siz + 1 << endl; 
			cin >> fl;
			if(!fl) return 0;
			cout << "? " << n << " " << siz << " 1 1 1 " <<  siz + 1 << endl; 
			cin >> fl;
		}
	}
	return fl;
}

bool Ask_Row(int x , bool pr , int P) {
	int fl = 0;
	if(pr) {
		if(x == 2) cout << "? " << n / 2 << " " << m <<  " 1 1 " <<  n / 2 + 1 << " 1 " << endl , cin >> fl; 
		else {
			int siz = (n - n / x) / 2;
			cout << "? " << siz << " " << m << " 1 1 " << n - siz + 1 << " 1" << endl;
			cin >> fl;
			if(!fl) return 0;
			cout << "? " << siz << " " << m << " 1 1 " << siz + 1 << " 1" << endl;
			cin >> fl;
		}
	}
	else {
		if(x % 2 == 0) cout << "? " << n / x << " " << m << " 1 1 " << n - n / x + 1 << " 1" << endl , cin >> fl;
		else {
			int S = (n / (x / P)) , siz = (S - S / P) / 2;
			cout << "? " << siz << " " << m << " 1 1 " << n - siz + 1 << " 1" << endl;
			cin >> fl;
			if(!fl) return 0;
			cout << "? " << siz << " " << m << " 1 1 " << siz + 1 << " 1" << endl;
			cin >> fl;
		}
	}
	return fl;
}

int main() {
	read(n),read(m);
	LL ans = 1;
	int N = n , M = m;
	for (int i = 2; i * i <= N; ++i) {
		if(N % i) continue;
		int tot = 1 , bas = i;
		while(N % i == 0 && Ask_Row(bas , bas == i , i)) tot ++ , bas = bas * i , N /= i;
		while(N % i == 0) N /= i;
		ans *= tot;
	} 
	if(N > 1 && Ask_Row(N , 1 , N)) ans *= 2;
	for (int i = 2; i * i <= M; ++i) {
		if(M % i) continue;
		int tot = 1 , bas = i;
		while(M % i == 0 && Ask_Col(bas , bas == i , i)) tot ++ , bas = bas * i , M /= i;
		while(M % i == 0) M /= i;
		ans *= tot;
	} 
	if(M > 1 && Ask_Col(M , 1 , M)) ans *= 2;
	cout << "! " << ans << endl;
	return 0;
}