#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])==2) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])==2) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=1,r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=1,r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])==2) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	bool flag=1;
	for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) {
		for(int i=0;i<5;i++) now[i]=cur[i];
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
			else r=mid-1;
		}
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
			else r=mid-1;
		}
		bool flag2=1;
		for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag2=0;
		}
		if(flag2) {
			for(int i=0;i<5;i++) now[i]=cur[i];
			l=now[L],r=now[R];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
				else l=mid+1;
			}
			l=now[L],r=now[R];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
				else r=mid-1;
			}
			l=now[U],r=now[D];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
				else l=mid+1;
			}
			l=now[U],r=now[D];
			while(r>=l) {
				mid=l+r>>1;
				if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
				else r=mid-1;
			}
			bool flag3=1;
			for(int i=0;i<5;i++) {
				if(ans1[i]!=now[i]) flag3=0;
			}
			if(flag3) {
				for(int i=0;i<5;i++) ans2[i]=cur[i];
			}
			else for(int i=0;i<5;i++) ans2[i]=now[i];
		}
		else for(int i=0;i<5;i++) ans2[i]=now[i];
	}
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])==2) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])==2) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=1,r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=1,r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])==2) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	bool flag=1;
	for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) {
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
			else r=mid-1;
		}
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
			else r=mid-1;
		}
		bool flag2=1;
		for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag2=0;
		}
		if(flag) for(int i=0;i<5;i++) ans2[i]=cur[i];
		else for(int i=0;i<5;i++) ans2[i]=now[i];
	}
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur1[MAXN],cur2[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	cur1[U]=cur1[L]=cur2[U]=cur2[L]=now[U]=now[L]=1;
	cur1[D]=cur1[R]=cur2[D]=cur2[R]=now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	if(check(now[U],now[L],now[D],now[R])==1&&check(1,now[L],now[U]-1,now[R])==1) {
		cur1[U]=now[U];cur2[D]=now[U]-1;
	}
	else {
		l=1,r=n;
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
			else l=mid+1;
		}
		cur1[R]=now[R];cur2[L]=now[R]+1;
	}

	///**********************************************
	for(int i=0;i<5;i++) now[i]=cur1[i];
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];

	///*************************************
	for(int i=0;i<5;i++) now[i]=cur2[i];
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])==2) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])==2) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=1,r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=1,r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])==2) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	bool flag=1;
	for(int i=0;i<5;i++) {
		if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) for(int i=0;i<5;i++) ans2[i]=cur[i];
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])==2) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])==2) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=1,r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=1,r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])==2) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	bool flag=1;
	for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) {
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
			else r=mid-1;
		}
		l=now[L],r=now[R];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
			else l=mid+1;
		}
		l=now[U],r=now[D];
		while(r>=l) {
			mid=l+r>>1;
			if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
			else r=mid-1;
		}
		bool flag2=1;
		for(int i=0;i<5;i++) {
			if(ans1[i]!=now[i]) flag2=0;
		}
		if(flag2) {
			l=now[L],r=now[R];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
				else l=mid+1;
			}
			l=now[L],r=now[R];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
				else r=mid-1;
			}
			l=now[U],r=now[D];
			while(r>=l) {
				mid=l+r>>1;
				if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
				else l=mid+1;
			}
			l=now[U],r=now[D];
			while(r>=l) {
				mid=l+r>>1;
				if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
				else r=mid-1;
			}
			bool flag3=1;
			for(int i=0;i<5;i++) {
				if(ans1[i]!=now[i]) flag3=0;
			}
			if(flag3) {
				for(int i=0;i<5;i++) ans2[i]=cur[i];
			}
			else for(int i=0;i<5;i++) ans2[i]=now[i];
		}
		else for(int i=0;i<5;i++) ans2[i]=now[i];
	}
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[MAXN];
int cur1[MAXN],cur2[MAXN],ans1[MAXN],ans2[MAXN];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	cur1[U]=cur1[L]=cur2[U]=cur2[L]=now[U]=now[L]=1;
	cur1[D]=cur1[R]=cur2[D]=cur2[R]=now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	if(check(now[U],now[L],now[D],now[R])==1&&check(1,now[L],now[U]-1,now[R])==1) {
		cur1[U]=now[U];cur2[D]=now[U]-1;
	}
	else {
		l=1,r=n;
		while(r>=l) {
			mid=l+r>>1;
			if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
			else l=mid+1;
		}
		cur1[R]=now[R];cur2[L]=now[R]+1;
	}

	///**********************************************
	for(int i=0;i<5;i++) now[i]=cur1[i];
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];

	///*************************************
	for(int i=0;i<5;i++) now[i]=cur2[i];
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[4];
int cur[4],ans1[4],ans2[4];
int n;

int check(int a,int b,int c,int d) {
	int ret;
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n,mid;
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])==2) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])==2) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=1,r=n;
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)==2) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=1,r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])==2) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],mid,now[R])>0) r=mid-1,now[D]=mid;
		else l=mid+1;
	}
	l=now[U],r=now[D];
	while(r>=l) {
		mid=l+r>>1;
		if(check(mid,now[L],now[D],now[R])>0) l=mid+1,now[U]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],mid,now[D],now[R])>0) l=mid+1,now[L]=mid;
		else r=mid-1;
	}
	l=now[L],r=now[R];
	while(r>=l) {
		mid=l+r>>1;
		if(check(now[U],now[L],now[D],mid)>0) r=mid-1,now[R]=mid;
		else l=mid+1;
	}
	bool flag=1;
	for(int i=0;i<5;i++) {
		if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) for(int i=0;i<5;i++) ans2[i]=cur[i];
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d\n",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<bits/stdc++.h>
#define MAXN 3005
#define LL long long
using namespace std;

const int U=0,D=1,L=2,R=3;
int now[4];
int cur[4],ans1[4],ans2[4];
int n;

int check() {
	int ret;
	printf("? %d %d %d %d",now[U],now[L],now[D],now[R]);
	fflush(stdout);
	scanf("%d",&ret);
	return ret;
}

int main() {
	scanf("%d",&n);
	now[U]=now[L]=1;now[D]=now[R]=n;

	///**********************************
	int l=1,r=n;
	while(r-l>1) {
		now[U]=l+r>>1;
		if(check()==2) l=now[U];
		else r=now[U];
	}
	if(check()!=2) now[U]--;
	l=now[U],r=n;
	while(r-l>1) {
		now[D]=l+r>>1;
		if(check()==2) r=now[D];
		else l=now[D];
	}
	if(check()!=2) now[D]++;
	l=1,r=n;
	while(r-l>1) {
		now[R]=l+r>>1;
		if(check()==2) r=now[R];
		else l=now[R];
	}
	if(check()!=2) now[R]++;
	l=1,r=now[R];
	while(r-l>1) {
		now[L]=l+r>>1;
		if(check()==2) l=now[L];
		else r=now[L];
	}
	if(check()!=2) now[L]--;

	for(int i=0;i<5;i++) cur[i]=now[i];

	///**********************************************
	l=now[U],r=now[D];
	while(r-l>1) {
		now[U]=l+r>>1;
		if(check()>0) l=now[U];
		else r=now[U];
	}
	if(check()<1) now[U]--;
	l=now[U],r=now[D];
	while(r-l>1) {
		now[D]=l+r>>1;
		if(check()>0) r=now[D];
		else l=now[D];
	}
	if(check()<1) now[D]++;
	l=now[L],r=now[R];
	while(r-l>1) {
		now[R]=l+r>>1;
		if(check()>0) r=now[R];
		else l=now[R];
	}
	if(check()<1) now[R]++;
	l=now[L],r=now[R];
	while(r-l>1) {
		now[L]=l+r>>1;
		if(check()>0) l=now[L];
		else r=now[L];
	}
	if(check()<1) now[L]--;
	for(int i=0;i<5;i++) ans1[i]=now[i];
	for(int i=0;i<5;i++) now[i]=cur[i];

	///*************************************
	l=now[U],r=now[D];
	while(r-l>1) {
		now[D]=l+r>>1;
		if(check()>0) r=now[D];
		else l=now[D];
	}
	if(check()<1) now[D]++;
	l=now[U],r=now[D];
	while(r-l>1) {
		now[U]=l+r>>1;
		if(check()>0) l=now[U];
		else r=now[U];
	}
	if(check()<1) now[U]--;
	l=now[L],r=now[R];
	while(r-l>1) {
		now[L]=l+r>>1;
		if(check()>0) l=now[L];
		else r=now[L];
	}
	if(check()<1) now[L]--;
	l=now[L],r=now[R];
	while(r-l>1) {
		now[R]=l+r>>1;
		if(check()>0) r=now[R];
		else l=now[R];
	}
	if(check()<1) now[R]++;
	bool flag=1;
	for(int i=0;i<5;i++) {
		if(ans1[i]!=now[i]) flag=0;
	}
	if(flag) for(int i=0;i<5;i++) ans2[i]=cur[i];
	else for(int i=0;i<5;i++) ans2[i]=now[i];
	///***************************************
	printf("! %d %d %d %d %d %d %d %d",ans1[U],ans1[L],ans1[D],ans1[R],ans2[U],ans2[L],ans2[D],ans2[R]);
	fflush(stdout);
	return 0;
}


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<climits>
#include<cmath>
#define LL long long

using namespace std;

int n;
struct data
{
    int x1,y1,x2,y2;
};

int query(int x1,int y1,int x2,int y2)
{
	if(x1>x2) swap(x1,x2);
    if(y1>y2) swap(y1,y2);
	printf("? %d %d %d %d\n",x1,y1,x2,y2);
	fflush(stdout);
	int x;scanf("%d",&x);
	return x;
}

void print(data x)
{
	printf("%d %d %d %d",x.x1,x.y1,x.x2,x.y2);
}

data find(int xx1,int yy1,int xx2,int yy2)
{
    data Ans;
    int l=yy1,r=yy2,ans=yy1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(xx1,yy1,xx2,mid)<1) l=mid+1;
        else r=mid-1,ans=mid;
    }
    Ans.y2=ans;
    l=yy1,r=yy2,ans=yy1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(xx1,mid,xx2,yy2)<1) r=mid-1;
        else l=mid+1,ans=mid;
    }
    Ans.y1=ans;
    l=xx1,r=xx2,ans=xx1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(xx1,yy1,mid,yy2)<1) l=mid+1;
        else r=mid-1,ans=mid;
    }
    Ans.x2=ans;
    l=xx1,r=xx2,ans=xx1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(mid,yy1,xx2,yy2)<1) r=mid-1;
        else l=mid+1,ans=mid;
    }
    Ans.x1=ans;
    return Ans;
}

int main()
{
    cin>>n;
    int l=1,r=n,ans=1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(1,1,mid,n)<1) l=mid+1;
        else r=mid-1,ans=mid;
    }
    if(query(1,1,ans,n)==1&&query(ans+1,1,n,n)==1)
    {
        data r1=find(1,1,ans,n);
        data r2=find(ans+1,1,n,n);
        putchar('!');putchar(' ');print(r1);putchar(' ');print(r2);
        fflush(stdout);
        return 0;
    }
    l=1,r=n,ans=1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(query(1,1,n,mid)<1) l=mid+1;
        else r=mid-1,ans=mid;
    }
    data r1=find(1,1,n,ans);
    data r2=find(1,ans+1,n,n);
    putchar('!');putchar(' ');print(r1);putchar(' ');print(r2);putchar('\n');
    fflush(stdout);
    return 0;
}


//84104971101048411497 - Can you guess what does this mean?
using namespace std;
#include <bits/stdc++.h>
#define mapii map<int, int>
#define debug(a) cout << #a << ": " << a << endl
#define debuga1(a, l, r) fto(i, l, r) cout << a[i] << " "; cout << endl
#define fdto(i,  r, l) for(int i = (r); i >= (l); --i)
#define fto(i, l, r) for(int i = (l); i <= (r); ++i)
#define forit(it, var) for(__typeof(var.begin()) it = var.begin(); it != var.end(); it++)
#define fordit(rit, var) for(__typeof(var.rbegin()) rit = var.rbegin(); rit != var.rend(); rit++)
#define ii pair<int, int>
#define iii pair<int, ii>
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define ll long long
#define maxN 100005

template <class T>
T min(T a, T b, T c) {
    return min(a, min(b, c));
}

template <class T>
T max(T a, T b, T c) {
    return max(a, max(b, c));
}

int n;
vector<int> ansX1, ansY1, ansX2, ansY2;

int ask(int x1, int y1, int x2, int y2) {
    printf("? %d %d %d %d\n", x1, y1, x2, y2);
    fflush(stdout);
    int ans;
    scanf("%d", &ans);
    return ans;
}

bool isIn(int l, int x, int r) {
    return (l <= x && x <= r);
}

void solve() {
    int x1 = 1, y1 = 1, x2 = n, y2 = n;

    int l = x1, r = x2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, mid, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], mid) && isIn(x1, ansX2[i], mid) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    x2 = res+1;

    l = x1, r = x2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(mid, y1, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(mid, ansX1[i], x2) && isIn(mid, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    x1 = res-1;

    l = y1, r = y2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, x2, mid);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], mid) && isIn(y1, ansY2[i], mid)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    y2 = res+1;

    l = y1, r = y2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, mid, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(mid, ansY1[i], y2) && isIn(mid, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    y1 = res-1;

    ansX1.pb(x1);
    ansY1.pb(y1);
    ansX2.pb(x2);
    ansY2.pb(y2);
    puts("Rec:");
    printf("%d %d %d %d\n", x1, y1, x2, y2);
}

int main () {
    #ifndef ONLINE_JUDGE
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
    #endif // ONLINE_JUDGE

    scanf("%d", &n);
    fto(i, 1, 2) solve();

    printf("!");
    fto(i, 0, 1) printf(" %d %d %d %d", ansX1[i], ansY1[i], ansX2[i], ansY2[i]);

    return 0;
}


//84104971101048411497 - Can you guess what does this mean?
using namespace std;
#include <bits/stdc++.h>
#define mapii map<int, int>
#define debug(a) cout << #a << ": " << a << endl
#define debuga1(a, l, r) fto(i, l, r) cout << a[i] << " "; cout << endl
#define fdto(i,  r, l) for(int i = (r); i >= (l); --i)
#define fto(i, l, r) for(int i = (l); i <= (r); ++i)
#define forit(it, var) for(__typeof(var.begin()) it = var.begin(); it != var.end(); it++)
#define fordit(rit, var) for(__typeof(var.rbegin()) rit = var.rbegin(); rit != var.rend(); rit++)
#define ii pair<int, int>
#define iii pair<int, ii>
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define ll long long
#define maxN 100005

template <class T>
T min(T a, T b, T c) {
    return min(a, min(b, c));
}

template <class T>
T max(T a, T b, T c) {
    return max(a, max(b, c));
}

int n;
vector<int> ansX1, ansY1, ansX2, ansY2;

int ask(int x1, int y1, int x2, int y2) {
    printf("? %d %d %d %d\n", x1, y1, x2, y2);
    fflush(stdout);
    int ans;
    scanf("%d", &ans);
    return ans;
}

bool isIn(int l, int x, int r) {
    return (l <= x && x <= r);
}

void solve() {
    int x1 = 1, y1 = 1, x2 = n, y2 = n;

    int l = x1, r = x2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, mid, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    x2 = res+1;

    l = x1, r = x2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(mid, y1, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    x1 = res-1;

    l = y1, r = y2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, x2, mid);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    y2 = res+1;

    l = y1, r = y2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, mid, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    y1 = res-1;

    ansX1.pb(x1);
    ansY1.pb(y1);
    ansX2.pb(x2);
    ansY2.pb(y2);
    puts("Rec:");
    printf("%d %d %d %d\n", x1, y1, x2, y2);
}

int main () {
    #ifndef ONLINE_JUDGE
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
    #endif // ONLINE_JUDGE

    scanf("%d", &n);
    fto(i, 1, 2) solve();

    printf("!");
    fto(i, 0, 1) printf(" %d %d %d %d", ansX1[i], ansY1[i], ansX2[i], ansY2[i]);

    return 0;
}


//84104971101048411497 - Can you guess what does this mean?
using namespace std;
#include <bits/stdc++.h>
#define mapii map<int, int>
#define debug(a) cout << #a << ": " << a << endl
#define debuga1(a, l, r) fto(i, l, r) cout << a[i] << " "; cout << endl
#define fdto(i,  r, l) for(int i = (r); i >= (l); --i)
#define fto(i, l, r) for(int i = (l); i <= (r); ++i)
#define forit(it, var) for(__typeof(var.begin()) it = var.begin(); it != var.end(); it++)
#define fordit(rit, var) for(__typeof(var.rbegin()) rit = var.rbegin(); rit != var.rend(); rit++)
#define ii pair<int, int>
#define iii pair<int, ii>
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
#define ll long long
#define maxN 100005

template <class T>
T min(T a, T b, T c) {
    return min(a, min(b, c));
}

template <class T>
T max(T a, T b, T c) {
    return max(a, max(b, c));
}

int n;
vector<int> ansX1, ansY1, ansX2, ansY2;

int ask(int x1, int y1, int x2, int y2) {
    printf("? %d %d %d %d\n", x1, y1, x2, y2);
    fflush(stdout);
    int ans;
    scanf("%d", &ans);
    return ans;
}

bool isIn(int l, int x, int r) {
    return (l <= x && x <= r);
}

void solve() {
    int x1 = 1, y1 = 1, x2 = n, y2 = n;

    int l = x1, r = x2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, mid, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], mid) && isIn(x1, ansX2[i], mid) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    x2 = res+1;

    l = x1, r = x2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(mid, y1, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(mid, ansX1[i], x2) && isIn(mid, ansX2[i], x2) && isIn(y1, ansY1[i], y2) && isIn(y1, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    x1 = res-1;

    l = y1, r = y2, res = l-1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, y1, x2, mid);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(y1, ansY1[i], mid) && isIn(y1, ansY2[i], mid)) --x;
        }
        if (x == 0) {
            res = max(res, mid);
            l = mid+1;
        }
        else r = mid-1;
    }
    y2 = res+1;

    l = y1, r = y2, res = r+1;
    while (l <= r) {
        int mid = (l+r)/2;
        int x = ask(x1, mid, x2, y2);
        fto(i, 0, (int)ansX1.size()-1) {
            if (isIn(x1, ansX1[i], x2) && isIn(x1, ansX2[i], x2) && isIn(mid, ansY1[i], y2) && isIn(mid, ansY2[i], y2)) --x;
        }
        if (x == 0) {
            res = min(res, mid);
            r = mid-1;
        }
        else l = mid+1;
    }
    y1 = res-1;

    ansX1.pb(x1);
    ansY1.pb(y1);
    ansX2.pb(x2);
    ansY2.pb(y2);
//    puts("Rec:");
//    printf("%d %d %d %d\n", x1, y1, x2, y2);
}

int main () {
    #ifndef ONLINE_JUDGE
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
    #endif // ONLINE_JUDGE

    scanf("%d", &n);
    fto(i, 1, 2) solve();

    printf("!");
    fto(i, 0, 1) printf(" %d %d %d %d", ansX1[i], ansY1[i], ansX2[i], ansY2[i]);

    return 0;
}


#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define pb push_back
#define pLL pair<LL,LL>
#define ff first
#define ss second
#define rep(i,a,b) for(LL i=a;i<=b;++i)
#define ld double
#define mp make_pair
#define vLL vector<LL>
#define vpLL vector<pLL>
#define vld vector<ld>
#define pld pair<ld,ld>
#define vpld vector<pld>
#define SLL set<LL>
#define SpLL set<pLL>
#define FIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

LL n;

pair<pLL,pLL> f(pLL a,pLL b)
{
    LL lx=a.ff,ly=a.ss,hx=b.ff,hy=b.ss;
    pair<pLL,pLL> ans;
    LL l=lx,r=hx,mid=(lx+hx)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,mid,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ff=mid;
    //cerr<<"Fin one "<<mid<<endl;
    l=lx,r=hx,mid=(lx+hx)/2;
    while(r-l>=1){
        printf("? %lld %lld %lld %lld\n",mid,ly,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ff.ff=l;
    //cerr<<"Fin two "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,hx,mid);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ss=mid;
    //cerr<<"Fin three "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(r-l>=1){
        printf("? %lld %lld %lld %lld\n",lx,mid,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0)  r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    //cerr<<"Fin four "<<mid<<endl;
    ans.ff.ss=l;
    return ans;

}
int main()
{
    scanf("%lld",&n);
    LL l=1,r=n,mid=(l+r)/2;
    while(l<r){
            //cerr<<l<<" "<<r<<endl;
        printf("? 1 1 %lld %lld\n",mid,n);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    if(mid==n) mid=-1;
    if(mid!=-1){
        printf("? %lld 1 %lld %lld\n",mid+1,n,n);
        fflush(stdout);
        LL tmp;
        scanf("%lld",&tmp);
        if(tmp!=1) mid=-1;
    }
    if(mid==-1){
        l=1,r=n,mid=(l+r)/2;
        while(l<r){
            printf("? 1 1 %lld %lld\n",n,mid);
            fflush(stdout);
            LL q;
            scanf("%lld",&q);
            if(q==0) l=mid+1;
            else r=mid;
            mid=(l+r)/2;
        }
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(n,mid));
        b=f(mp(1,mid+1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
    else{
            //cerr<<mid<<endl;
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(mid,n));
        //cerr<<"Sq 1 over\n";
        b=f(mp(mid+1,1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
}


#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define pb push_back
#define pLL pair<LL,LL>
#define ff first
#define ss second
#define rep(i,a,b) for(LL i=a;i<=b;++i)
#define ld double
#define mp make_pair
#define vLL vector<LL>
#define vpLL vector<pLL>
#define vld vector<ld>
#define pld pair<ld,ld>
#define vpld vector<pld>
#define SLL set<LL>
#define SpLL set<pLL>
#define FIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

LL n;
pair<pLL,pLL> f(pLL a,pLL b)
{
    LL lx=a.ff,ly=a.ss,hx=b.ff,hy=b.ss,prev;
    pair<pLL,pLL> ans;
    LL l=lx,r=hx,mid=(lx+hx)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,mid,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ff=mid;
    //cerr<<"Fin one "<<mid<<endl;
    l=lx,r=hx,mid=(lx+hx)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",mid,ly,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    ans.ff.ff=mid;
    //cerr<<"Fin two "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,hx,mid);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ss=mid;
    //cerr<<"Fin three "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",lx,mid,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    //cerr<<"Fin four "<<mid<<endl;
    ans.ff.ss=mid;
    return ans;

}
int main()
{
    scanf("%lld",&n);
    LL l=1,r=n,mid=(l+r)/2;
    while(l<r){
            //cerr<<l<<" "<<r<<endl;
        printf("? 1 1 %lld %lld\n",mid,n);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    printf("? %lld 1 %lld %lld\n",mid+1,n,n);
    fflush(stdout);
    LL tmp;
    scanf("%lld",&tmp);
    if(tmp!=1) mid=-1;
    if(mid==-1){
        l=1,r=n,mid=(l+r)/2;
        while(l<r){
            printf("? 1 1 %lld %lld\n",n,mid);
            fflush(stdout);
            LL q;
            scanf("%lld",&q);
            if(q==0) l=mid+1;
            else r=mid;
            mid=(l+r)/2;
        }
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(n,mid));
        b=f(mp(1,mid+1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
    else{
            //cerr<<mid<<endl;
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(mid,n));
        //cerr<<"Sq 1 over\n";
        b=f(mp(mid+1,1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
}


#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define pb push_back
#define pLL pair<LL,LL>
#define ff first
#define ss second
#define rep(i,a,b) for(LL i=a;i<=b;++i)
#define ld double
#define mp make_pair
#define vLL vector<LL>
#define vpLL vector<pLL>
#define vld vector<ld>
#define pld pair<ld,ld>
#define vpld vector<pld>
#define SLL set<LL>
#define SpLL set<pLL>
#define FIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

LL n;

pair<pLL,pLL> f(pLL a,pLL b)
{
    LL lx=a.ff,ly=a.ss,hx=b.ff,hy=b.ss;
    pair<pLL,pLL> ans;
    LL l=lx,r=hx,mid=(lx+hx)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,mid,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ff=mid;
    //cerr<<"Fin one "<<mid<<endl;
    l=lx,r=hx,mid=(lx+hx)/2;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",mid,ly,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0&&l!=r)  r=mid;
        else if(q==0) {mid=l-1;break;}
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ff.ff=mid;
    //cerr<<"Fin two "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,hx,mid);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ss=mid;
    //cerr<<"Fin three "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",lx,mid,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0&&l!=r)  r=mid;
        else if(q==0) {mid=l-1;break;}
        else l=mid+1;
        mid=(l+r)/2;
    }
    //cerr<<"Fin four "<<mid<<endl;
    ans.ff.ss=mid;
    return ans;

}
int main()
{
    scanf("%lld",&n);
    LL l=1,r=n,mid=(l+r)/2;
    while(l<r){
            //cerr<<l<<" "<<r<<endl;
        printf("? 1 1 %lld %lld\n",mid,n);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    if(mid==n) mid=-1;
    if(mid!=-1){
        printf("? %lld 1 %lld %lld\n",mid+1,n,n);
        fflush(stdout);
        LL tmp;
        scanf("%lld",&tmp);
        if(tmp!=1) mid=-1;
    }
    if(mid==-1){
        l=1,r=n,mid=(l+r)/2;
        while(l<r){
            printf("? 1 1 %lld %lld\n",n,mid);
            fflush(stdout);
            LL q;
            scanf("%lld",&q);
            if(q==0) l=mid+1;
            else r=mid;
            mid=(l+r)/2;
        }
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(n,mid));
        b=f(mp(1,mid+1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
    else{
            //cerr<<mid<<endl;
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(mid,n));
        //cerr<<"Sq 1 over\n";
        b=f(mp(mid+1,1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
}


#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define pb push_back
#define pLL pair<LL,LL>
#define ff first
#define ss second
#define rep(i,a,b) for(LL i=a;i<=b;++i)
#define ld double
#define mp make_pair
#define vLL vector<LL>
#define vpLL vector<pLL>
#define vld vector<ld>
#define pld pair<ld,ld>
#define vpld vector<pld>
#define SLL set<LL>
#define SpLL set<pLL>
#define FIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

LL n;
pair<pLL,pLL> f(pLL a,pLL b)
{
    LL lx=a.ff,ly=a.ss,hx=b.ff,hy=b.ss,prev;
    pair<pLL,pLL> ans;
    LL l=lx,r=hx,mid=(lx+hx)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,mid,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ff=mid;
    //cerr<<"Fin one "<<mid<<endl;
    l=lx,r=hx,mid=(lx+hx)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",mid,ly,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    ans.ff.ff=mid;
    //cerr<<"Fin two "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,hx,mid);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ss=mid;
    //cerr<<"Fin three "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",lx,mid,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    //cerr<<"Fin four "<<mid<<endl;
    ans.ff.ss=mid;
    return ans;

}
int main()
{
    scanf("%lld",&n);
    LL l=1,r=n,mid=(l+r)/2;
    while(l<r){
            //cerr<<l<<" "<<r<<endl;
        printf("? 1 1 %lld %lld\n",mid,n);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) l=mid+1;
        else r=mid;
        if(l==r){
            printf("? 1 1 %lld %lld\n",l,n);
            fflush(stdout);
            scanf("%lld",&q);
            if(q==2){
                mid=-1;
                break;
            }
        }
        mid=(l+r)/2;
    }
    if(mid==-1){
        l=1,r=n,mid=(l+r)/2;
        while(l<r){
            printf("? 1 1 %lld %lld\n",n,mid);
            fflush(stdout);
            LL q;
            scanf("%lld",&q);
            if(q==0) l=mid+1;
            else r=mid;
            if(mid==(l+r)/2){
                mid=-1;
                break;
            }
            mid=(l+r)/2;
        }
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(n,mid));
        b=f(mp(1,mid+1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
    else{
            //cerr<<mid<<endl;
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(mid,n));
        //cerr<<"Sq 1 over\n";
        b=f(mp(mid+1,1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
}


#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define pb push_back
#define pLL pair<LL,LL>
#define ff first
#define ss second
#define rep(i,a,b) for(LL i=a;i<=b;++i)
#define ld double
#define mp make_pair
#define vLL vector<LL>
#define vpLL vector<pLL>
#define vld vector<ld>
#define pld pair<ld,ld>
#define vpld vector<pld>
#define SLL set<LL>
#define SpLL set<pLL>
#define FIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

LL n;
pair<pLL,pLL> f(pLL a,pLL b)
{
    LL lx=a.ff,ly=a.ss,hx=b.ff,hy=b.ss,prev;
    pair<pLL,pLL> ans;
    LL l=lx,r=hx,mid=(lx+hx)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,mid,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ff=mid;
    //cerr<<"Fin one "<<mid<<endl;
    l=lx,r=hx,mid=(lx+hx)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",mid,ly,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    ans.ff.ff=mid;
    //cerr<<"Fin two "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2;
    while(l<r){
        printf("? %lld %lld %lld %lld\n",lx,ly,hx,mid);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==1) r=mid;
        else l=mid+1;
        mid=(l+r)/2;
    }
    ans.ss.ss=mid;
    //cerr<<"Fin three "<<mid<<endl;
    l=ly,r=hy,mid=(ly+hy)/2,prev=-1;
    while(l<=r){
        printf("? %lld %lld %lld %lld\n",lx,mid,hx,hy);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) if(prev!=-1){mid=prev;break;}else r=mid;
        else l=mid+1,prev=mid;
        mid=(l+r)/2;
    }
    //cerr<<"Fin four "<<mid<<endl;
    ans.ff.ss=mid;
    return ans;

}
int main()
{
    scanf("%lld",&n);
    LL l=1,r=n,mid=(l+r)/2;
    while(l<r){
            //cerr<<l<<" "<<r<<endl;
        printf("? 1 1 %lld %lld\n",mid,n);
        fflush(stdout);
        LL q;
        scanf("%lld",&q);
        if(q==0) l=mid+1;
        else r=mid;
        mid=(l+r)/2;
    }
    if(mid==n) mid=-1;
    if(mid!=-1){
        printf("? %lld 1 %lld %lld\n",mid+1,n,n);
        fflush(stdout);
        LL tmp;
        scanf("%lld",&tmp);
        if(tmp!=1) mid=-1;
    }
    if(mid==-1){
        l=1,r=n,mid=(l+r)/2;
        while(l<r){
            printf("? 1 1 %lld %lld\n",n,mid);
            fflush(stdout);
            LL q;
            scanf("%lld",&q);
            if(q==0) l=mid+1;
            else r=mid;
            mid=(l+r)/2;
        }
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(n,mid));
        b=f(mp(1,mid+1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
    else{
            //cerr<<mid<<endl;
        pair<pLL,pLL> a,b;
        a=f(mp(1,1),mp(mid,n));
        //cerr<<"Sq 1 over\n";
        b=f(mp(mid+1,1),mp(n,n));
        printf("! %lld %lld %lld %lld %lld %lld %lld %lld\n",a.ff.ff,a.ff.ss,a.ss.ff,a.ss.ss,b.ff.ff,b.ff.ss,b.ss.ff,b.ss.ss);
        fflush(stdout);
    }
}


#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <deque>
#include <bitset>
#include <algorithm>

using namespace std;

const double eps=1e-10;
const double pi=3.1415926535897932384626433832795;
const double eln=2.718281828459045235360287471352;

#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define scan2(x, y) scanf("%d%d", &x, &y)
#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define sqr(x) (x) * (x)
#define pr(x) printf("Case %d: ",x)
#define prn(x) printf("Case %d:\n",x)
#define prr(x) printf("Case #%d: ",x)
#define prrn(x) printf("Case #%d:\n",x)
#define lowbit(x) (x&(-x))

int QA(int x1,int y1,int x2,int y2)
{
	int t;
	printf("? %d %d %d %d\n",x1,y1,x2,y2);
	scanf("%d",&t);
	return t;
}

int pdud(int n)
{
	int l=1,r=n;
	while(r-l>1)
	{
		int mid=(l+r)>>1;
		int ans=QA(1,1,mid,n);
		if(ans==1)return mid;
		if(ans>0)r=mid;else l=mid;
	}
	int ans=QA(1,1,l,n);
	if(ans==1)return l;
	ans=QA(1,1,r,n);
	if(ans==1)return r;
	return -1;
}

int pdlr(int n)
{
	int l=1,r=n;
	while(r-l>1)
	{
		int mid=(l+r)>>1;
		int ans=QA(1,1,n,mid);
		if(ans==1)return mid;
		if(ans>0)r=mid;else l=mid;
	}
	int ans=QA(1,1,n,l);
	if(ans==1)return l;
	ans=QA(1,1,n,r);
	if(ans==1)return r;
	return -1;
}

int row[2][2],col[2][2];

void find(int r1,int c1,int r2,int c2,int t)
{
	//�����±߽�
	int l=r1,r=r2;
	int mid,ans;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(mid,c1,r2,c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(r,c1,r2,c2);
	if(ans==1)row[t][0]=r;else row[t][0]=l;

	//�����ϱ߽�
	l=row[t][0],r=r2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],c1,mid,c2);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],c1,l,c2);
	if(ans==1)row[t][1]=l;else row[t][1]=r;

	//������߽�
	l=c1,r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],mid,row[t][1],c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(row[t][0],r,row[t][1],c2);
	if(ans==1)col[t][0]=r;else col[t][0]=l;

	//�����ұ߽�
	l=col[t][0],r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],col[t][0],row[t][1],mid);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],col[t][0],row[t][1],l);
	if(ans==1)col[t][1]=l;else col[t][1]=r;

}

int main()
{
	int n;
	scanf("%d",&n);
	int r1=pdud(n);
	if(r1<0)
	{
		int u1=pdlr(n);
		find(1,1,n,u1,0);
		find(1,u1+1,n,n,1);
	}else
	{
		find(1,1,r1,n,0);
		find(r1+1,1,n,n,1);
	}
	printf("! %d %d %d %d",row[0][0],col[0][0],row[0][1],col[0][1]);
	printf(" %d %d %d %d\n",row[1][0],col[1][0],row[1][1],col[1][1]);
    return 0;
}


#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <deque>
#include <bitset>
#include <algorithm>

using namespace std;

const double eps=1e-10;
const double pi=3.1415926535897932384626433832795;
const double eln=2.718281828459045235360287471352;

#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define scan2(x, y) scanf("%d%d", &x, &y)
#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define sqr(x) (x) * (x)
#define pr(x) printf("Case %d: ",x)
#define prn(x) printf("Case %d:\n",x)
#define prr(x) printf("Case #%d: ",x)
#define prrn(x) printf("Case #%d:\n",x)
#define lowbit(x) (x&(-x))

int QA(int x1,int y1,int x2,int y2)
{
	int t;
	printf("? %d %d %d %d\n",x1,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&t);
	return t;
}

int pdud(int n)
{
	int l=1,r=n;
	int mid,ans1,ans2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans1=QA(1,1,mid,n);
		ans2=QA(mid+1,1,n,n);
		if(ans1==1 && ans2==1)return mid;
		if(ans1==2 || ans2==0)r=mid;else l=mid;
	}
	ans1=QA(1,1,l,n);
	ans2=QA(r,1,n,n);
	if(ans1*ans2==1)return l;else return -1;
}

int pdlr(int n)
{
	int l=1,r=n;
	int mid,ans1,ans2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans1=QA(1,1,n,mid);
		ans2=QA(1,mid+1,n,n);
		if(ans1==1 && ans2==1)return mid;
		if(ans1==2 || ans2==0)r=mid;else l=mid;
	}
	ans1=QA(1,1,n,l);
	ans2=QA(1,r,n,n);
	if(ans1*ans2==1)return l;else return -1;
}

int row[2][2],col[2][2];

void find(int r1,int c1,int r2,int c2,int t)
{
	//�����±߽�
	int l=r1,r=r2;
	int mid,ans;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(mid,c1,r2,c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(r,c1,r2,c2);
	if(ans==1)row[t][0]=r;else row[t][0]=l;

	//�����ϱ߽�
	l=row[t][0],r=r2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],c1,mid,c2);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],c1,l,c2);
	if(ans==1)row[t][1]=l;else row[t][1]=r;

	//������߽�
	l=c1,r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],mid,row[t][1],c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(row[t][0],r,row[t][1],c2);
	if(ans==1)col[t][0]=r;else col[t][0]=l;

	//�����ұ߽�
	l=col[t][0],r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],col[t][0],row[t][1],mid);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],col[t][0],row[t][1],l);
	if(ans==1)col[t][1]=l;else col[t][1]=r;

}

int main()
{
	int n;
	scanf("%d",&n);
	int r1=pdud(n);
	if(r1<0)
	{
		int u1=pdlr(n);
		find(1,1,n,u1,0);
		find(1,u1+1,n,n,1);
	}else
	{
		find(1,1,r1,n,0);
		find(r1+1,1,n,n,1);
	}
	printf("! %d %d %d %d",row[0][0],col[0][0],row[0][1],col[0][1]);
	printf(" %d %d %d %d\n",row[1][0],col[1][0],row[1][1],col[1][1]);
    return 0;
}


#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <deque>
#include <bitset>
#include <algorithm>

using namespace std;

const double eps=1e-10;
const double pi=3.1415926535897932384626433832795;
const double eln=2.718281828459045235360287471352;

#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define scan2(x, y) scanf("%d%d", &x, &y)
#define scan3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define sqr(x) (x) * (x)
#define pr(x) printf("Case %d: ",x)
#define prn(x) printf("Case %d:\n",x)
#define prr(x) printf("Case #%d: ",x)
#define prrn(x) printf("Case #%d:\n",x)
#define lowbit(x) (x&(-x))

int QA(int x1,int y1,int x2,int y2)
{
	int t;
	printf("? %d %d %d %d\n",x1,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&t);
	return t;
}

int pdud(int n)
{
	int l=1,r=n;
	while(r-l>1)
	{
		int mid=(l+r)>>1;
		int ans=QA(1,1,mid,n);
		if(ans==1)return mid;
		if(ans>0)r=mid;else l=mid;
	}
	int ans=QA(1,1,l,n);
	if(ans==1)return l;
	ans=QA(1,1,r,n);
	if(ans==1)return r;
	return -1;
}

int pdlr(int n)
{
	int l=1,r=n;
	while(r-l>1)
	{
		int mid=(l+r)>>1;
		int ans=QA(1,1,n,mid);
		if(ans==1)return mid;
		if(ans>0)r=mid;else l=mid;
	}
	int ans=QA(1,1,n,l);
	if(ans==1)return l;
	ans=QA(1,1,n,r);
	if(ans==1)return r;
	return -1;
}

int row[2][2],col[2][2];

void find(int r1,int c1,int r2,int c2,int t)
{
	//�����±߽�
	int l=r1,r=r2;
	int mid,ans;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(mid,c1,r2,c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(r,c1,r2,c2);
	if(ans==1)row[t][0]=r;else row[t][0]=l;

	//�����ϱ߽�
	l=row[t][0],r=r2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],c1,mid,c2);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],c1,l,c2);
	if(ans==1)row[t][1]=l;else row[t][1]=r;

	//������߽�
	l=c1,r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],mid,row[t][1],c2);
		if(ans>0)l=mid;else r=mid;
	}
	ans=QA(row[t][0],r,row[t][1],c2);
	if(ans==1)col[t][0]=r;else col[t][0]=l;

	//�����ұ߽�
	l=col[t][0],r=c2;
	while(r-l>1)
	{
		mid=(l+r)>>1;
		ans=QA(row[t][0],col[t][0],row[t][1],mid);
		if(ans>0)r=mid;else l=mid;
	}
	ans=QA(row[t][0],col[t][0],row[t][1],l);
	if(ans==1)col[t][1]=l;else col[t][1]=r;

}

int main()
{
	int n;
	scanf("%d",&n);
	int r1=pdud(n);
	if(r1<0)
	{
		int u1=pdlr(n);
		find(1,1,n,u1,0);
		find(1,u1+1,n,n,1);
	}else
	{
		find(1,1,r1,n,0);
		find(r1+1,1,n,n,1);
	}
	printf("! %d %d %d %d",row[0][0],col[0][0],row[0][1],col[0][1]);
	printf(" %d %d %d %d\n",row[1][0],col[1][0],row[1][1],col[1][1]);
    return 0;
}


#include<bits/stdc++.h>

using namespace std;

int X[2][2];
int Y[2][2];

int n;

void find1(){
    int x1 = 1, y1 = 1 , x2 = n , y2 = n;
/*********find X2 **********///printf("find X2\n");
    int tx = x1,res;
    while(tx<x2){
        int x = ( (tx+x2)>>1 );
        if(x==tx){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            x2 = x;
        }else {
            tx = x + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,tx,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        x2 = tx;
    }

/********** find X1 ***********///printf("find X1\n");
    tx = x2;
    while( x1 < tx ){
        int x = (tx+x1)>>1;
        if(x==x1){
            break;
        }printf("? %d %d %d %d\n",x,y1,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            x1 = x;
        }else {
            tx = x-1;
        }
    }printf("? %d %d %d %d\n",tx,y1,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        x1 = tx;
    }

/******************* find Y2 *****************///printf("find Y2\n");
    int ty = y1;
    while(ty<y2){
        int y = ( (ty+y2)>>1 );
        if(y==ty){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x2,y);fflush(stdout);
        scanf("%d",&res);
        if(res){
            y2 = y;
        }else {
            ty = y + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,x2,ty);fflush(stdout);
    scanf("%d",&res);
    if(res){
        y2=ty;
    }

/********************* find Y1 ***************///printf("find Y1\n");
    ty = y2;
    while( y1 < ty ){
        int y = (ty+y1)>>1;
        if(y==y1){
            break;
        }fflush(stdout);printf("? %d %d %d %d\n",x1,y,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            y1 = y;
        }else {
            ty = y-1;
        }
    }printf("? %d %d %d %d\n",x1,ty,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        y1 = ty;
    }X[0][0]=x1;X[0][1]=x2;
    Y[0][0]=y1;Y[0][1]=y2;
}

int check(int x1,int y1,int x2,int y2){
    return x1<=X[0][0]&&x2>=X[0][1]&&y1<=Y[0][0]&&y2>=Y[0][1];
}

void find2(){
    int x1 = 1, y1 = 1 , x2 = n , y2 = n;
/*********find X2 **********/ //printf("find X2\n");
    int tx = x1,res;
    while(tx<x2){
        int x = ( (tx+x2)>>1 );
        if(x==tx){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y1,x,y2)){
            x2 = x;
        }else {
            tx = x + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,tx,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,y1,tx,y2)){
        x2 = tx;
    }
/********** find X1 ***********///printf("find X1\n");
    tx = x2;
    while( x1 < tx ){
        int x = (tx+x1)>>1;
        if(x==x1){
            break;
        }printf("? %d %d %d %d\n",x,y1,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x,y1,x2,y2)){
            x1 = x;
        }else {
            tx = x-1;
        }
    }printf("? %d %d %d %d\n",tx,y1,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(tx,y1,x2,y2)){
        x1 = tx;
    }

/******************* find Y2 *****************///printf("find Y2\n");
    int ty = y1;
    while(ty<y2){
        int y = ( (ty+y2)>>1 );
        if(y==ty){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x2,y);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y1,x2,y)){
            y2 = y;
        }else {
            ty = y + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,x2,ty);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,y1,x2,ty)){
        y2=ty;
    }

/********************* find Y1 ***************///printf("find Y1\n");
    ty = y2;
    while( y1 < ty ){
        int y = (ty+y1)>>1;
        if(y==y1){
            break;
        }printf("? %d %d %d %d\n",x1,y,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y,x2,y2)){
            y1 = y;
        }else {
            ty = y-1;
        }
    }printf("? %d %d %d %d\n",x1,ty,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,ty,x2,y2)){
        y1 = ty;
    }X[1][0]=x1;X[1][1]=x2;
    Y[1][0]=y1;Y[1][1]=y2;
}

int main()
{

    scanf("%d",&n);
    find1();
    find2();
    printf("! %d %d %d %d %d %d %d %d\n",X[0][0],Y[0][0],X[0][1],Y[0][1],X[1][0],Y[1][0],X[1][1],Y[1][1]);
    fflush(stdout);return 0;
}


#include<bits/stdc++.h>

using namespace std;

int X[2][2];
int Y[2][2];

int n;

void find1(){
    int x1 = 1, y1 = 1 , x2 = n , y2 = n;
/*********find X2 **********///printf("find X2\n");
    int tx = x1,res;
    while(tx<x2){
        int x = ( (tx+x2)>>1 );
        if(x==tx){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            x2 = x;
        }else {
            tx = x + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,tx,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        x2 = tx;
    }

/********** find X1 ***********///printf("find X1\n");
    tx = x2;
    while( x1 < tx ){
        int x = (tx+x1)>>1;
        if(x==x1){
            break;
        }printf("? %d %d %d %d\n",x,y1,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            x1 = x;
        }else {
            tx = x-1;
        }
    }printf("? %d %d %d %d\n",tx,y1,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        x1 = tx;
    }

/******************* find Y2 *****************///printf("find Y2\n");
    int ty = y1;
    while(tx<y2){
        int y = ( (tx+y2)>>1 );
        if(y==ty){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x2,y);fflush(stdout);
        scanf("%d",&res);
        if(res){
            y2 = y;
        }else {
            ty = y + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,x2,ty);fflush(stdout);
    scanf("%d",&res);
    if(res){
        y2=ty;
    }

/********************* find Y1 ***************///printf("find Y1\n");
    ty = y2;
    while( y1 < ty ){
        int y = (ty+y1)>>1;
        if(y==y1){
            break;
        }fflush(stdout);printf("? %d %d %d %d\n",x1,y,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res){
            y1 = y;
        }else {
            ty = y-1;
        }
    }printf("? %d %d %d %d\n",x1,ty,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res){
        y1 = ty;
    }X[0][0]=x1;X[0][1]=x2;
    Y[0][0]=y1;Y[0][1]=y2;
}

int check(int x1,int y1,int x2,int y2){
    return x1<=X[0][0]&&x2>=X[0][1]&&y1<=Y[0][0]&&y2>=Y[0][1];
}

void find2(){
    int x1 = 1, y1 = 1 , x2 = n , y2 = n;
/*********find X2 **********/ //printf("find X2\n");
    int tx = x1,res;
    while(tx<x2){
        int x = ( (tx+x2)>>1 );
        if(x==tx){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y1,x,y2)){
            x2 = x;
        }else {
            tx = x + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,tx,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,y1,tx,y2)){
        x2 = tx;
    }
/********** find X1 ***********///printf("find X1\n");
    tx = x2;
    while( x1 < tx ){
        int x = (tx+x1)>>1;
        if(x==x1){
            break;
        }printf("? %d %d %d %d\n",x,y1,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x,y1,x2,y2)){
            x1 = x;
        }else {
            tx = x-1;
        }
    }printf("? %d %d %d %d\n",tx,y1,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(tx,y1,x2,y2)){
        x1 = tx;
    }

/******************* find Y2 *****************///printf("find Y2\n");
    int ty = y1;
    while(ty<y2){
        int y = ( (ty+y2)>>1 );
        if(y==ty){
            break;
        }printf("? %d %d %d %d\n",x1,y1,x2,y);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y1,x2,y)){
            y2 = y;
        }else {
            ty = y + 1;
        }
    }printf("? %d %d %d %d\n",x1,y1,x2,ty);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,y1,x2,ty)){
        y2=ty;
    }

/********************* find Y1 ***************///printf("find Y1\n");
    ty = y2;
    while( y1 < ty ){
        int y = (ty+y1)>>1;
        if(y==y1){
            break;
        }printf("? %d %d %d %d\n",x1,y,x2,y2);fflush(stdout);
        scanf("%d",&res);
        if(res>check(x1,y,x2,y2)){
            y1 = y;
        }else {
            ty = y-1;
        }
    }printf("? %d %d %d %d\n",x1,ty,x2,y2);fflush(stdout);
    scanf("%d",&res);
    if(res>check(x1,ty,x2,y2)){
        y1 = ty;
    }X[1][0]=x1;X[1][1]=x2;
    Y[1][0]=y1;Y[1][1]=y2;
}

int main()
{

    scanf("%d",&n);
    find1();
    find2();
    printf("! %d %d %d %d %d %d %d %d\n",X[0][0],Y[0][0],X[0][1],Y[0][1],X[1][0],Y[1][0],X[1][1],Y[1][1]);
    fflush(stdout);return 0;
}


#include<bits/stdc++.h>

#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pb2 pop_back
#define pf push_front
#define pf2 pop_front
#define line printf("\n");fflush(stdout)
#define rep(k,i,j) for(int k = (int)i;k<(int) j;k++)
#define repd(k,i,j) for(int k = i;k>=(int)j;k--)
#define ll long long
#define pq priority_queue

const int INF = 1e9+7;
const ll INFLL = 1e16;
const double EPS = 1e-6;

using namespace std;

ll A[5];
ll B[5];
ll n;

int query(ll a[]){
	cout<<"? "<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3];
	line;

	int ret;
	scanf("%d",&ret);
	return ret;
}

void fix(ll a[],int k){
	ll ki = a[0],ka = a[2];

	if(k%2)ki = a[1],ka = a[3];
	while(ki<=ka){
		ll mid = (ki+ka)>>1;

		ll b[5];
		rep(i,0,4)b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k>1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k>1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k>=2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(ll a[]){
	fix(a,3);
	fix(a,1);
	fix(a,2);
	fix(a,0);
}
void sec_rec(ll a[]){
	fix(a,1);
	fix(a,3);
	fix(a,0);
	fix(a,2);
}
int main(){
	cin>>n;

	rep(k,0,4){
		if(k<2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	//rep(k,0,4)cout<<A[k]<<" ";puts(" ");
	sec_rec(B);

	printf("! ");
	rep(k,0,4)cout<<A[k]<<" ";
	rep(k,0,4)cout<<B[k]<<" ";
	line;

	return 0;
}


#include<bits/stdc++.h>

#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pb2 pop_back
#define pf push_front
#define pf2 pop_front
#define line printf("\n");fflush(stdout)
#define rep(k,i,j) for(int k = (int)i;k<(int) j;k++)
#define repd(k,i,j) for(int k = i;k>=(int)j;k--)
#define ll long long
#define pq priority_queue

const int INF = 1e9+7;
const ll INFLL = 1e16;
const double EPS = 1e-6;

using namespace std;

ll A[5];
ll B[5];
ll n;

int query(ll a[]){
	cout<<"? "<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3];
	line;

	int ret;
	scanf("%d",&ret);
	return ret;
}

void fix(ll a[],int k){
	ll ki = a[0],ka = a[2];

	if(k%2)ki = a[1],ka = a[3];
	while(ki<=ka){
		ll mid = (ki+ka)>>1;

		ll b[5];
		rep(i,0,4)b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k>1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k>1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k>=2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(ll a[]){
	fix(a,3);
	fix(a,2);
	fix(a,0);
	fix(a,0);
}
void sec_rec(ll a[]){
	fix(a,1);
	fix(a,0);
	fix(a,2);
	fix(a,3);
}
int main(){
	cin>>n;

	rep(k,0,4){
		if(k<2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	//rep(k,0,4)cout<<A[k]<<" ";puts(" ");
	sec_rec(B);

	printf("! ");
	rep(k,0,4)cout<<A[k]<<" ";
	rep(k,0,4)cout<<B[k]<<" ";
	line;

	return 0;
}


#include<bits/stdc++.h>

#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pb2 pop_back
#define pf push_front
#define pf2 pop_front
#define line printf("\n");fflush(stdout)
#define rep(k,i,j) for(int k = (int)i;k<(int) j;k++)
#define repd(k,i,j) for(int k = i;k>=(int)j;k--)
#define ll long long
#define pq priority_queue

const int INF = 1e9+7;
const ll INFLL = 1e16;
const double EPS = 1e-6;

using namespace std;

ll A[5];
ll B[5];
ll n;

int query(ll a[]){
	cout<<"? "<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3];
	line;

	int ret;
	scanf("%d",&ret);
	return ret;
}

void fix(ll a[],int k){
	ll ki = a[0],ka = a[2];

	if(k%2)ki = a[1],ka = a[3];
	while(ki<=ka){
		ll mid = (ki+ka)>>1;

		ll b[5];
		rep(i,0,4)b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k>1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k>1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k>=2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(ll a[]){
	fix(a,3);
	fix(a,2);
	fix(a,0);
	fix(a,1);
}
void sec_rec(ll a[]){
	fix(a,1);
	fix(a,0);
	fix(a,2);
	fix(a,3);
}
int main(){
	cin>>n;

	rep(k,0,4){
		if(k<2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	//rep(k,0,4)cout<<A[k]<<" ";puts(" ");
	sec_rec(B);

	printf("! ");
	rep(k,0,4)cout<<A[k]<<" ";
	rep(k,0,4)cout<<B[k]<<" ";
	line;

	return 0;
}


//我知道抄代码不是好事情
//然而这种构造题太赛艇了
//所以我就不做啦，谢谢原作者
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#define sqr(x) ((x)*(x))
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fi first
#define se second
#define mp make_pair
#define eps 1e-8
#define FL fflush(stdout);
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;

int l,r,n,a[4][2],tot,ans[8],b[4];
bool pd;

int Query(int r1,int c1,int r2,int c2){
	int ret;
	printf("? %d %d %d %d\n",r1,c1,r2,c2);
	FL
	scanf("%d",&ret);
	return ret;
}

int main(){
	scanf("%d",&n);
	l = 1 , r = n;
	while(l<r){
		int  mid = (l+r)/2;
		if(Query(1,1,n,mid)==2) r = mid; else l = mid+1;
	}
	l = 1 ,a[0][0]=r;
	while(l<r){
		int mid = (l+r)/2;
		if(Query(1,1,n,mid)>0) r = mid; else l = mid+1;
	}
	a[0][1]=r;
	l =1 , r= n;
	while(l<r){
		int mid =(l+r+1)/2;
		if(Query(1,mid,n,n)==2) l = mid; else r= mid-1;
	}
	a[1][0]=l;
	r =  n;
	while(l<r){
		int mid =(l+r+1)/2;
		if(Query(1,mid,n,n)>0) l = mid; else r= mid-1;
	}
	a[1][1]=l;
	l = 1, r = n;
	while(l<r){
		int mid = (l+r)/2;
		if(Query(1,1,mid,n)==2) r= mid; else l= mid+1;
	}
	a[2][0]=r;
	l = 1;
	while(l<r){
		int mid = (l+r)/2;
		if(Query(1,1,mid,n)>0) r= mid; else l= mid+1;
	}
	a[2][1]=r;
	l = 1, r= n;
	while(l<r){
		int mid =(l+r+1)/2;
		if(Query(mid,1,n,n)==2) l = mid; else r= mid-1;
	}
	a[3][0]=l;
	r = n;
	while(l<r){
		int mid =(l+r+1)/2;
		if(Query(mid,1,n,n)>0) l = mid; else r= mid-1;
	}
	a[3][1]=l;
	//for(int i =0;i<4;i++) cout<<a[i][0]<<' '<<a[i][1]<<endl;
	for(int i=0;i<1<<4;i++){
		for(int j=0;j<4;j++) if(i&1<<j) b[j]=1; else b[j]=0;
		bool pd = true;
		if(a[3][b[3]]>a[2][b[2]] || a[1][b[1]]>a[0][b[0]] || Query(a[3][b[3]],a[1][b[1]],a[2][b[2]],a[0][b[0]])!=1) pd = false;
		if(a[3][1^b[3]]>a[2][1^b[2]] || a[1][1^b[1]]>a[0][1^b[0]] || Query(a[3][1^b[3]],a[1][1^b[1]],a[2][1^b[2]],a[0][1^b[0]])!=1) pd = false;
		if(a[0][b[0]]>=a[1][1^b[1]] && a[2][b[2]]>=a[3][1^b[3]]) pd =false;
		if(pd){
			ans[0]=a[3][b[3]];
			ans[1]=a[1][b[1]];
			ans[2]=a[2][b[2]];
			ans[3]=a[0][b[0]];
			ans[0+4]=a[3][1^b[3]];
			ans[1+4]=a[1][1^b[1]];
			ans[2+4]=a[2][1^b[2]];
			ans[3+4]=a[0][1^b[0]];
			break;
		}
	}
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	return 0;
}


#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
    x=0;char ch;bool flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
inline int query(int a,int b,int c,int d){
    printf("? %d %d %d %d\n",a,b,c,d);
    fflush(stdout);
    int x;read(x);
    return x;
}
int main(){
    int n;read(n);
    int l = 1,r = n;
    int x1=0,x2=0,y1=0,y2=0,x3=0,x4=0,y3=0,y4=0;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(1,1,n,mid);
        if(x) r = mid-1,y2 = mid;
        else l = mid+1;
    }
    l = 1;r = n;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(1,1,mid,y2);
        if(x) r = mid-1,x2 = mid;
        else l = mid+1;
    }
    l = 1;r = x2;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(mid,1,x2,y2);
        if(x) l = mid+1,x1 = mid;
        else r = mid-1;
    }
    l = 1;r = y2;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(x1,mid,x2,y2);
        if(x) l = mid+1,y1 = mid;
        else r = mid-1;
    }
    l = 1;r = n;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(1,1,mid,n);
        if((x1>=1&&x1<=mid)&&(x2>=1&&x2<=mid)&&(y1>=1&&y1<=n)&&(y2>=1&&y2<=n)) --x;
        if(x) r = mid-1,x4 = mid;
        else l = mid+1;
    }
    l = 1;r = x4;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(mid,1,x4,n);
        if((x1>=mid&&x1<=x4)&&(x2>=mid&&x2<=x4)&&(y1>=1&&y1<=n)&&(y2>=1&&y2<=n)) --x;
        if(x) l = mid+1,x3 = mid;
        else r = mid-1;
    }
    l = 1;r = n;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(x3,1,x4,mid);
        if((x1>=x3&&x1<=x4)&&(x2>=x3&&x2<=x4)&&(y1>=1&&y1<=mid)&&(y2>=1&&y2<=mid)) --x;
        if(x) r = mid-1,y4 = mid;
        else l = mid+1;
    }
    l = 1;r = y4;
    while(l <= r){
        int mid = l+r >> 1;
        int x = query(x3,mid,x4,y4);
        if((x1>=x3&&x1<=x4)&&(x2>=x3&&x2<=x4)&&(y1>=mid&&y1<=y4)&&(y2>=mid&&y2<=y4)) --x;
        if(x) l = mid+1,y3 = mid;
        else r = mid-1;
    }
    printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,x3,y3,x4,y4);
    fflush(stdout);
    getchar();getchar();
    return 0;
}


#include<cstdio>
int n,t,q[9];
int query(int a,int b,int c,int d)
{
	printf("? %d %d %d %d\n",a,b,c,d);
	fflush(stdout);
	int x;
	scanf("%d",&x);
	return x;
}
void work(int x1,int y1,int x2,int y2)
{
	int l,r,m;
	for (l=x1,r=x2; l<r;)
	{
		int m=l+r+1>>1;
		if (query(m,y1,x2,y2)) l=m;
		else r=m-1;
	}
	q[++t]=l;
	for (l=y1,r=y2; l<r;)
	{
		int m=l+r+1>>1;
		if (query(x1,m,x2,y2)) l=m;
		else r=m-1;
	}
	q[++t]=l;
	for (l=x1,r=x2; l<r;)
	{
		int m=l+r>>1;
		if (!query(x1,y1,m,y2)) l=m+1;
		else r=m;
	}
	q[++t]=l;
	for (l=y1,r=y2; l<r;)
	{
		int m=l+r>>1;
		if (!query(x1,y1,x2,m)) l=m+1;
		else r=m;
	}
	q[++t]=l;
}
void find_cut()
{
	int l,r,m;
	for (l=1,r=n; l<r;)
	{
		m=l+r>>1;
		if (!query(1,1,n,m)) l=m+1;
		else r=m;
	}
	if (query(1,1,n,l)==1&&query(1,l+1,n,n)==1)
	{
		work(1,1,n,l);
		work(1,l+1,n,n);
		return;
	}
	for (l=1,r=n; l<r;)
	{
		m=l+r>>1;
		if (!query(1,1,m,n)) l=m+1;
		else r=m;
	}
	work(1,1,l,n);
	work(l+1,1,n,n);
}
int main()
{
	scanf("%d",&n);
	find_cut();
	printf("!");
	for (int i=1; i<=8; i++) printf(" %d",q[i]);
}


#include<bits/stdc++.h>

using namespace std;

long long A[6], B[6], n;

int query(long long a[]){
	cout << "? " << a[0] << " " << a[1] << " " << a[2] << " " << a[3];
	int ret;
	cin >> ret;
	return ret;
}

void fix(long long a[],int k){
	long long ki = a[0], ka = a[2];
	if(k % 2) ki = a[1], ka = a[3];
	while(ki <= ka){
		long long mid = (ki + ka)/2;
		long long b[5];
		for(int i = 0; i < 4; i++)
            b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k > 1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k > 1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k >= 2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(long long a[]){
	fix(a, 3);
	fix(a, 2);
	fix(a, 0);
	fix(a, 1);
}
void sec_rec(long long a[]){
	fix(a, 1);
	fix(a, 0);
	fix(a, 2);
	fix(a, 3);
}
int main(){
    ios_base::sync_with_stdio(false);
    //freopen("inp.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	cin >> n;
	for(int k = 0; k < 3; k++){
		if(k < 2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	sec_rec(B);
	cout << "! ";
	for(int k = 0; k < 4; k++)
        cout << A[k] << " ";
	for(int k = 0; k < 4; k++)
        cout << B[k] << " ";
    cout << endl;
    fflush(stdout);
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int n;
vector <int> ans;
bool h = true;

int find(int x1, int y1, int x2, int y2){
	if(h)
		printf("? %d %d %d %d\n", x1, y1, x2, y2);
	else
		printf("? %d %d %d %d\n", y1, x1, y2, x2);
	fflush(stdout);
	int x;
	scanf("%d", &x);
	return x;
	}

void add(int x,int y){
	if(h){
		ans.push_back(x);
		ans.push_back(y);
		} else {
			ans.push_back(y);
			ans.push_back(x);
		}
	}

void find1(int x1, int y1, int x2, int y2){
	int l = y1 - 1;
	int r = y2;
	while(r - l > 1){
		int m = (r + l)/2;
		if(find (x1, y1, x2, m) >= 1)
			r = m;
		else
			l = m;
		}
	y2=r;

	l = x1 - 1;
	r = x2;
	while(r - l > 1){
		int m = (r + l)/2;
		if(find (x1, y1, m, y2) >= 1)
			r = m;
		else
			l = m;
		}
	x2=r;

	l = y1;
	r = y2 + 1;
	while(r - l > 1){
		int m = (r + l)/2;
		if(find (x1, m, x2, y2) >= 1)
			l = m;
		else
			r = m;

		}
	y1=l;

	l = x1;
	r = x2 + 1;
	while(r - l > 1){
		int m = (r + l)/2;
		if(find (m, y1, x2, y2) >= 1)
			l = m;
		else
			r = m;
		}
	x1=l;
	add(x1,y1);
	add(x2,y2);
}

bool qwe(int n){
	int l = 0, r = n;
	while(r - l > 1){
		int m = (l + r)/2;
		if(find (1, 1, n ,m ) > 0)
			r = m;
		else
			l = m;
		}
	if(r < n && find(1, r + 1, n, n) > 0){
		find1(1, r+1, n, n);
		find1(1, 1, n, r + 1);
		return true;
		}
	else
		return false;
	}

int main(){
    ios_base::sync_with_stdio(false);
	scanf("%d", &n);
	if(qwe(n)){}
	else{
		h = false;
		qwe(n);
		}
	cout << "! ";
	for(int i = 0; i < 8; i++)
		cout << ans[i] << ' ';
	fflush(stdout);
	return 0;
	}


#include<bits/stdc++.h>

using namespace std;

long long A[6], B[6], n;

int query(long long a[]){
	cout << "? " << a[0] << " " << a[1] << " " << a[2] << " " << a[3];
	int ret;
	cin >> ret;
	return ret;
}

void fix(long long a[],int k){
	long long ki = a[0], ka = a[2];
	if(k % 2) ki = a[1], ka = a[3];
	while(ki <= ka){
		long long mid = (ki + ka)/2;
		long long b[5];
		for(int i = 0; i < 4; i++)
            b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k > 1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k > 1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k >= 2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(long long a[]){
	fix(a, 3);
	fix(a, 2);
	fix(a, 0);
	fix(a, 1);
}
void sec_rec(long long a[]){
	fix(a, 1);
	fix(a, 0);
	fix(a, 2);
	fix(a, 3);
}
int main(){
    ios_base::sync_with_stdio(false);
    //freopen("inp.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	cin >> n;
	for(int k = 0; k < 3; k++){
		if(k < 2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	sec_rec(B);
	cout << "! ";
	for(int k = 0; k < 4; k++)
        cout << A[k] << " ";
	for(int k = 0; k < 4; k++)
        cout << B[k] << " ";
	return 0;
}


#include<bits/stdc++.h>

using namespace std;

long long A[6], B[6], n;

int query(long long a[]){
	cout << "? " << a[0] << " " << a[1] << " " << a[2] << " " << a[3];
	cout << endl;
    fflush(stdout);
	int ret;
	cin >> ret;
	return ret;
}

void fix(long long a[],int k){
	long long ki = a[0], ka = a[2];
	if(k % 2) ki = a[1], ka = a[3];
	while(ki <= ka){
		long long mid = (ki + ka)/2;
		long long b[5];
		for(int i = 0; i < 4; i++)
            b[i] = a[i];
		b[k] = mid;
		if(query(b)){
			if(k > 1)ka = mid-1;
			else ki = mid+1;
		}
		else{
			if(k > 1)ki = mid+1;
			else ka = mid-1;
		}
	}
	if(k >= 2)a[k] = ki;
	else a[k] = ka;
}
void first_rec(long long a[]){
	fix(a, 3);
	fix(a, 2);
	fix(a, 0);
	fix(a, 1);
}
void sec_rec(long long a[]){
	fix(a, 1);
	fix(a, 0);
	fix(a, 2);
	fix(a, 3);
}
int main(){
    ios_base::sync_with_stdio(false);
    //freopen("inp.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	cin >> n;
	for(int k = 0; k < 3; k++){
		if(k < 2)A[k] = B[k] = 1;
		else A[k] = B[k] = n;
	}
	first_rec(A);
	sec_rec(B);
	cout << "! ";
	for(int k = 0; k < 4; k++)
        cout << A[k] << " ";
	for(int k = 0; k < 4; k++)
        cout << B[k] << " ";
    cout << endl;
    fflush(stdout);
	return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n;
int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);
	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
void solvey(int ll,int rr){
	int mid,l=ll,r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,ax,n,bx);
		if(tmp){
			l=mid+1;ay=mid;
		}
		else r=mid-1;
	}
	l=ay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(ay,ax,mid,bx);
		if(tmp){
			r=mid-1;by=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp==2){
			l=mid+1;aay=mid;
		}
		else r=mid-1;
	}
	l=aay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(aay,aax,mid,bbx);
		if(tmp){
			r=mid-1;bby=mid;
		}
		else l=mid+1;
	}
}

void solvex(int ll,int rr){
	int l=ll,r=rr,mid;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp){
			l=mid+1;ax=mid;
		}
		else r=mid-1;
	}
	l=ax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,ax,n,mid);
		if(tmp){
			r=mid-1;bx=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp==2){
			l=mid+1;aax=mid;
		}
		else r=mid-1;
	}
	l=aax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,aax,n,mid);
		if(tmp){
			r=mid-1;bbx=mid;
		}
		else l=mid+1;
	}
}

int main()
{
	scanf("%d",&n);
	solvex(1,n);
	solvey(1,n);
	printf("! %d %d %d %d %d %d %d %d\n",ay,ax,by,bx,aay,aax,bby,bbx);
	fflush(stdout);
    return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n;
int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);
	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
int m=-1;
void div_col(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,mid,n),f2=ask(mid+1,1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else if(!f2)r=mid-1;
	}
}

void div_row(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,n,mid),f2=ask(1,mid+1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else if(!f2)r=mid-1;
	}
}

void solve(int lx,int ly,int rx,int ry){
	int ans[4];memset(ans,0,sizeof(ans));
	int l=lx,r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(mid,ly,rx,ry)){
			ans[0]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=lx;r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,mid,ry)){
			ans[2]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,mid,rx,ry)){
			ans[1]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,rx,mid)){
			ans[3]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	if(!ax){
		ax=ans[0];ay=ans[1];bx=ans[2];by=ans[3];
	}
	else{
		aax=ans[0];aay=ans[1];bbx=ans[2];bby=ans[3];
	}
}

int main()
{
	scanf("%d",&n);
	div_col();
	if(m==-1){
		div_row();
		solve(1,1,n,m);solve(1,m+1,n,n);
	}
	else{
		solve(1,1,m,n);solve(m+1,1,n,n);
	}
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
	fflush(stdout);
    return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n=10;
int a1=2,a2=2,a3=4,a4=1;
int b1=5,b2=5,b3=5,b4=10;
int check(int lx,int ly,int rx,int ry){
	int cnt=0;
	if(a1>=lx&&a1<=rx&&a2>=ly&&a2<=ry&&a3>=lx&&a3<=rx&&a4>=ly&&a4<=ry)cnt++;
	if(b1>=lx&&b1<=rx&&b2>=ly&&b2<=ry&&b3>=lx&&b3<=rx&&b4>=ly&&b4<=ry)cnt++;
	return cnt;
}
int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);

	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
int m=-1;
void div_col(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,mid,n),f2=ask(mid+1,1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else r=mid-1;
	}
}

void div_row(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,n,mid),f2=ask(1,mid+1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else r=mid-1;
	}
}

void solve(int lx,int ly,int rx,int ry){
	int ans[4];memset(ans,0,sizeof(ans));
	int l=lx,r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(mid,ly,rx,ry)){
			ans[0]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=lx;r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,mid,ry)){
			ans[2]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,mid,rx,ry)){
			ans[1]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,rx,mid)){
			ans[3]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	if(!ax){
		ax=ans[0];ay=ans[1];bx=ans[2];by=ans[3];
	}
	else{
		aax=ans[0];aay=ans[1];bbx=ans[2];bby=ans[3];
	}
}

int main()
{
	scanf("%d",&n);
	div_col();
	if(m==-1){
		div_row();
		solve(1,1,n,m);solve(1,m+1,n,n);
	}
	else{
		solve(1,1,m,n);solve(m+1,1,n,n);
	}
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
	fflush(stdout);
    return 0;
}


 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n;

int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);
	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
void solvey(int ll,int rr){
	int mid,l=ll,r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp){
			l=mid+1;ay=mid;
		}
		else r=mid-1;
	}
	l=ay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(ay,1,mid,n);
		if(tmp){
			r=mid-1;by=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp==2){
			l=mid+1;aay=mid;
		}
		else r=mid-1;
	}
	l=aay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(aay,1,mid,n);
		if(tmp){
			r=mid-1;bby=mid;
		}
		else l=mid+1;
	}
}

void solvex(int ll,int rr){
	int l=ll,r=rr,mid;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp){
			l=mid+1;ax=mid;
		}
		else r=mid-1;
	}
	l=ax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,ax,n,mid);
		if(tmp){
			r=mid-1;bx=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp==2){
			l=mid+1;aax=mid;
		}
		else r=mid-1;
	}
	l=aax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,aax,n,mid);
		if(tmp){
			r=mid-1;bbx=mid;
		}
		else l=mid+1;
	}
}

int main()
{
    //freopen("D:\\in.txt","r",stdin);
	scanf("%d",&n);
	solvex(1,n);
	solvey(1,n);
	printf("! %d %d %d %d %d %d %d %d\n",ay,ax,by,bx,aay,aax,bby,bbx);
	fflush(stdout);
    return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n=10;
int a1=2,a2=2,a3=4,a4=1;
int b1=5,b2=5,b3=5,b4=10;
int check(int lx,int ly,int rx,int ry){
	int cnt=0;
	if(a1>=lx&&a1<=rx&&a2>=ly&&a2<=ry&&a3>=lx&&a3<=rx&&a4>=ly&&a4<=ry)cnt++;
	if(b1>=lx&&b1<=rx&&b2>=ly&&b2<=ry&&b3>=lx&&b3<=rx&&b4>=ly&&b4<=ry)cnt++;
	return cnt;
}
int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);

	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
int m=-1;
void div_col(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,mid,n),f2=ask(mid+1,1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else if(!f2)r=mid-1;
	}
}

void div_row(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		int f1=ask(1,1,n,mid),f2=ask(1,mid+1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else if(!f2)r=mid-1;
	}
}

void solve(int lx,int ly,int rx,int ry){
	int ans[4];memset(ans,0,sizeof(ans));
	int l=lx,r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(mid,ly,rx,ry)){
			ans[0]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=lx;r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,mid,ry)){
			ans[2]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,mid,rx,ry)){
			ans[1]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,rx,mid)){
			ans[3]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	if(!ax){
		ax=ans[0];ay=ans[1];bx=ans[2];by=ans[3];
	}
	else{
		aax=ans[0];aay=ans[1];bbx=ans[2];bby=ans[3];
	}
}

int main()
{
	scanf("%d",&n);
	div_col();
	if(m==-1){
		div_row();
		solve(1,1,n,m);solve(1,m+1,n,n);
	}
	else{
		solve(1,1,m,n);solve(m+1,1,n,n);
	}
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
	fflush(stdout);
    return 0;
}


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n=10;
int a1=2,a2=2,a3=4,a4=1;
int b1=5,b2=5,b3=5,b4=10;
int check(int lx,int ly,int rx,int ry){
	int cnt=0;
	if(a1>=lx&&a1<=rx&&a2>=ly&&a2<=ry&&a3>=lx&&a3<=rx&&a4>=ly&&a4<=ry)cnt++;
	if(b1>=lx&&b1<=rx&&b2>=ly&&b2<=ry&&b3>=lx&&b3<=rx&&b4>=ly&&b4<=ry)cnt++;
	return cnt;
}
int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);

	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
int m=-1;
void div_col(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		if(mid+1>n)return;
		int f1=ask(1,1,mid,n),f2=ask(mid+1,1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else r=mid-1;
	}
}

void div_row(){
	int l=1,r=n;
	while(l<=r){
		int mid=l+r>>1;
		if(mid+1>n)return;
		int f1=ask(1,1,n,mid),f2=ask(1,mid+1,n,n);
		if(f1==1&&f2==1){
			m=mid;return;
		}
		else if(!f1)l=mid+1;
		else r=mid-1;
	}
}

void solve(int lx,int ly,int rx,int ry){
	int ans[4];memset(ans,0,sizeof(ans));
	int l=lx,r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(mid,ly,rx,ry)){
			ans[0]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=lx;r=rx;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,mid,ry)){
			ans[2]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,mid,rx,ry)){
			ans[1]=mid;l=mid+1;
		}
		else r=mid-1;
	}
	l=ly;r=ry;
	while(l<=r){
		int mid=l+r>>1;
		if(ask(lx,ly,rx,mid)){
			ans[3]=mid;r=mid-1;
		}
		else l=mid+1;
	}
	if(!ax){
		ax=ans[0];ay=ans[1];bx=ans[2];by=ans[3];
	}
	else{
		aax=ans[0];aay=ans[1];bbx=ans[2];bby=ans[3];
	}
}

int main()
{
	scanf("%d",&n);
	div_col();
	if(m==-1){
		div_row();
		solve(1,1,n,m);solve(1,m+1,n,n);
	}
	else{
		solve(1,1,m,n);solve(m+1,1,n,n);
	}
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
	fflush(stdout);
    return 0;
}


 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n;

int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);
	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
void solvey(int ll,int rr){
	int mid,l=ll,r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp){
			l=mid+1;ay=mid;
		}
		else r=mid-1;
	}
	l=ay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(ay,1,mid,n);
		if(tmp){
			r=mid-1;by=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp==2){
			l=mid+1;aay=mid;
		}
		else r=mid-1;
	}
	l=aay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(aay,1,mid,n);
		if(tmp){
			r=mid-1;bby=mid;
		}
		else l=mid+1;
	}
}

void solvex(int ll,int rr){
	int l=ll,r=rr,mid;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp){
			l=mid+1;ax=mid;
		}
		else r=mid-1;
	}
	l=ax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,ax,n,mid);
		if(tmp){
			r=mid-1;bx=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp==2){
			l=mid+1;aax=mid;
		}
		else r=mid-1;
	}
	l=aax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,aax,n,mid);
		if(tmp){
			r=mid-1;bbx=mid;
		}
		else l=mid+1;
	}
}

int main()
{
    //freopen("D:\\in.txt","r",stdin);
	scanf("%d",&n);
	solvex(1,n);
	solvey(1,n);
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
    return 0;
}


 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 LL;
int n;

int ask(int lx,int ly,int rx,int ry){
	printf("? %d %d %d %d\n",lx,ly,rx,ry);
	fflush(stdout);
	int rtn;scanf("%d",&rtn);
	return rtn;
}
int ax,ay,bx,by,aax,aay,bbx,bby;
void solvey(int ll,int rr){
	int mid,l=ll,r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp){
			l=mid+1;ay=mid;
		}
		else r=mid-1;
	}
	l=ay;r=rr;
	printf("%d\n",ay);
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(ay,1,mid,n);
		if(tmp){
			r=mid-1;by=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	printf("%d\n",by);
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(mid,1,n,n);
		if(tmp==2){
			l=mid+1;aay=mid;
		}
		else r=mid-1;
	}
	printf("%d\n",aay);l=aay;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(aay,1,mid,n);
		if(tmp){
			r=mid-1;bby=mid;
		}
		else l=mid+1;
	}
	printf("%d\n",bby);
}

void solvex(int ll,int rr){
	int l=ll,r=rr,mid;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp){
			l=mid+1;ax=mid;
		}
		else r=mid-1;
	}
	l=ax;r=rr;
	printf("%d\n",ax);
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,ax,n,mid);
		if(tmp){
			r=mid-1;bx=mid;
		}
		else l=mid+1;
	}
	l=ll;r=rr;
	printf("%d\n",bx);
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,mid,n,n);
		if(tmp==2){
			l=mid+1;aax=mid;
		}
		else r=mid-1;
	}
	printf("%d\n",aax);l=aax;r=rr;
	while(l<=r){
		mid=l+r>>1;
		int tmp=ask(1,aax,n,mid);
		if(tmp){
			r=mid-1;bbx=mid;
		}
		else l=mid+1;
	}
	printf("%d\n",bbx);
}

int main()
{
    //freopen("D:\\in.txt","r",stdin);
	scanf("%d",&n);
	solvex(1,n);
	solvey(1,n);
	printf("! %d %d %d %d %d %d %d %d\n",ax,ay,bx,by,aax,aay,bbx,bby);
    return 0;
}


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<cstdlib>

int n,x1,x2,y1,y2,a1,a2,b1,b2,mid,l,r;
int x;

bool check1() {//尽量靠下
	if(mid>x2) return 0;
	printf("? %d %d %d %d\n",mid,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check2() {
	if(mid<x1) return 0;
	printf("? %d %d %d %d\n",x1,y1,mid,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check3() {
	if(mid>y2) return 0;
	printf("? %d %d %d %d\n",x1,mid,x2,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check4() {
	if(y1>mid) return 0;
	printf("? %d %d %d %d\n",x1,y1,x2,mid);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check5() {
	if(a1>mid) return 0;
	printf("? %d %d %d %d\n",a1,b1,mid,b2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

void swap(int &a,int &b) {
	int t=a; a=b; b=t;
}

bool check6() {
	if(mid>a2) return 0;
	printf("? %d %d %d %d\n",mid,b1,a2,b2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check7() {
	printf("? %d %d %d %d\n",a1,mid,a2,b2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

bool check8() {
	if(b1>mid) return 0;
	printf("? %d %d %d %d\n",a1,b1,a2,mid);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}
int main() {
	scanf("%d",&n);
	x1=1; y1=1; x2=n; y2=n;
	{
		l=1; r=n;
		mid=l+r >> 1;
		while(mid-l>1) {
			if(check1()) l=mid,mid=l+r >> 1;
			else mid=l+mid >> 1;
		}
		if(mid!=n) ++mid;
		while(!check1()) --mid;
		x1=mid;
	}{
		l=x1; r=n;
		mid=l+r >> 1;
		while(r-mid>1) {
			if(check2()) r=mid,mid=l+r >> 1;
			else mid=r+mid >> 1;
		}
		if(mid>1) --mid;
		while(!check2()) ++mid;
		x2=mid;
	}{
		l=1; r=n;
		mid=l+r >> 1;
		while(mid-l>1) {
			if(check3()) l=mid,mid=l+r >> 1;
			else mid=l+mid >> 1;
		}
		if(mid!=n) ++mid;
		while(!check3()) --mid;
		y1=mid;
	}{
		l=y1; r=n;
		mid=l+r >> 1;
		while(r-mid>1) {
			if(check4()) r=mid,mid=l+r >> 1;
			else mid=r+mid >> 1;
		}
		if(mid>1) --mid;
		while(!check4()) ++mid;
		y2=mid;
	}
	a1=1; b1=1; a2=n; b2=n;
	{
		l=1;r=n;mid=l+r >> 1;
		while(r-mid>1) {
			if(check5()) r=mid,mid=l+r >> 1;
			else mid=r+mid >> 1;
		}
		if(mid>1) --mid;
		while(!check5()) ++mid;
		a2=mid;
	}{
		l=1;r=a2;mid=l+r >> 1;
		while(mid-l>1) {
			if(check6()) l=mid,mid=l+r >> 1;
			else mid=l+mid >> 1;
		}
		if(mid!=n) ++mid;
		while(!check6()) --mid;
		a1=mid;
	}{
		l=1; r=n;
		mid=l+r >> 1;
		while(mid-l>1) {
			if(check7()) l=mid,mid=l+r >> 1;
			else mid=l+mid >> 1;
		}
		if(mid!=n) ++mid;
		while(!check7()) --mid;
		b1=mid;
	}{
		l=b1; r=n;
		mid=l+r >> 1;
		while(r-mid>1) {
			if(check8()) r=mid,mid=l+r >> 1;
			else mid=r+mid >> 1;
		}
		if(mid>1) --mid;
		while(!check8()) ++mid;
		b2=mid;
	}
	if(x1>a1) {
		swap(x1,a1),swap(x2,a2),swap(y1,b1),swap(y2,b2);
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	fflush(stdout);
	//for(;;);
	return 0;
}