#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000;
int fac[N+10],d[N+10];
void init(){
	for(int i=2;i<=N;i++){
		if(!fac[i]){
			for(int j=i;j<=N;j+=i){
				fac[j]=i;	
			}
		}
		for(int j=i;j<=N;j+=i)d[j]++;
	}
	for(int i=1;i<=N;i++)d[i]++;
}
int query(int h,int w,int i1,int j1,int i2,int j2){
	printf("? %d %d %d %d %d %d\n",h,w,i1,j1,i2,j2);
	fflush(stdout);
	int t;scanf("%d",&t);
	return t;
}
int n,m;
bool check_row(int r,int p){
	if(p==2)return query(r/2,m,1,1,r/2+1,1);
	int d=r/p,c=(p/2)*d; 
	return query(c,m,1,1,c+1,1)&&
		   query(c,m,1,1,c+1+d,1);
}
bool check_col(int r,int p){
	if(p==2)return query(n,r/2,1,1,1,r/2+1);
	int d=r/p,c=(p/2)*d;
	return query(n,c,1,1,1,c+1)&&
		   query(n,c,1,1,1,c+1+d);	
}
int main(){
	cin>>n>>m;
	int x=1,y=1;
	init();
	for(int i=n;i>1;i/=fac[i]){
		//cout<<"???x"<<x<<' '<<fac[i]<<endl;
		if(check_row(n/x,fac[i]))x*=fac[i];
	}
	for(int i=m;i>1;i/=fac[i]){
		//cout<<"???y"<<y<<' '<<fac[i]<<endl;
		if(check_col(m/y,fac[i]))y*=fac[i];
	}
	cout<<"! "<<d[x]*d[y]<<endl;
} 