#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() {//尽量靠下
	printf("? %d %d %d %d\n",mid,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

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

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

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

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

bool check6() {
	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() {
	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;
		}
		++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;
		}
		--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;
		}
		++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;
		}
		--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;
		}
		--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;
		}
		++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;
		}
		++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;
		}
		--mid;
		while(!check8()) ++mid;
		b2=mid;
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	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() {
	if(mid>b2) return 0;
	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
		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;
	}{//r
		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
		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;
	}{//r
		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;
	{//r
		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
		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;
	}{//r
		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;
	}{//l
		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;
	}
/*	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;
}


#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,pre;

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(x1>mid) 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 in(int a,int b,int c,int d) {
	return a<=x1 && b<=y1 && c>=x2 && d>=y2;
}

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

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>in(mid,b1,a2,b2);
}

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

bool check8() {
	if(b1>mid) return 0;
	printf("? %d %d %d %d\n",a1,b1,a2,mid);
	fflush(stdout);
	scanf("%d",&x);
	return x>in(a1,b1,a2,mid);
}

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

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

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

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

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

bool check6() {
	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() {
	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;
		}
		++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;
		}
		--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;
		}
		++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;
		}
		--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;
		}
		--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;
		}
		++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;
		}
		++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;
		}
		--mid;
		while(!check8()) ++mid;
		b2=mid;
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	for(;;);
	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() {//尽量靠下
	printf("? %d %d %d %d\n",mid,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

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

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

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

bool check5() {
	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() {
	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() {
	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;
		}
		++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;
		}
		--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;
		}
		++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;
		}
		--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;
		}
		--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;
		}
		++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;
		}
		++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;
		}
		--mid;
		while(!check8()) ++mid;
		b2=mid;
	}
/*	if(x1>a1) {
		swap(x1,a1),swap(x2,a2),swap(y1,b1),swap(y2,b2),
	}
	if() {
		swap(
	}*/
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	fflush(stdout);
	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() {//尽量靠下
	printf("? %d %d %d %d\n",mid,y1,x2,y2);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}

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

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

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

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

bool check6() {
	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() {
	printf("? %d %d %d %d\n",a1,b1,a2,mid);
	fflush(stdout);
	scanf("%d",&x);
	return x!=0;
}
int main() {
	scanf("%",&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;
		}
		++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;
		}
		--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;
		}
		++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;
		}
		--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;
		}
		--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;
		}
		++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;
		}
		++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;
		}
		--mid;
		while(!check8()) ++mid;
		b2=mid;
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	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,pre;

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(x1>mid) 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() {
	if(mid>b2) return 0;
	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
		l=1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check1()) l=mid;
				else r=mid;
			mid=l+r >> 1;
		}
		if(mid!=n) ++mid;
		while(!check1()) --mid;
		x1=mid;
	}{//r
		l=x1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check2()) r=mid;
				else l=mid;
            mid=l+r >> 1;
		}
		if(mid>1) --mid;
		while(!check2()) ++mid;
		x2=mid;
	}{//l
		l=1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check3()) l=mid;
				else r=mid;
			mid=l+r >> 1;
		}
		if(mid!=n) ++mid;
		while(!check3()) --mid;
		y1=mid;
	}{//r
		l=y1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check4()) r=mid;
				else l=mid;
			mid=l+r >> 1;
		}
		if(mid>1) --mid;
		while(!check4()) ++mid;
		y2=mid;
	}
	a1=1; b1=1; a2=n; b2=n;
	{//r
		l=1;r=n;mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check5()) r=mid;
				else l=mid;
			mid=l+r >> 1;
		}
		if(mid>1) --mid;
		while(!check5()) ++mid;
		a2=mid;
	}{//l
		l=1;r=a2;mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check6()) l=mid;
				else r=mid;
			mid=l+r >> 1;
		}
		if(mid!=n) ++mid;
		while(!check6()) --mid;
		a1=mid;
	}{//r
		l=b1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid!=pre) {
			pre=mid;
			if(check8()) r=mid;
				else l=mid;
			mid=l+r >> 1;
		}
		if(mid>1) --mid;
		while(!check8()) ++mid;
		b2=mid;
	}{//l
		l=1; r=n;
		mid=l+r >> 1;
		pre=0;
		while(mid-l>1) {
			if(check7()) l=mid;
				else r=mid;
			mid=l+r >> 1;
		}
		if(mid!=n) ++mid;
		while(!check7()) --mid;
		b1=mid;
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	fflush(stdout);
	//for(;;);
	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(x1>mid) 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() {
	if(mid>b2) return 0;
	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
		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;
	}{//r
		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
		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;
	}{//r
		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;
	{//r
		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
		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;
	}{//r
		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;
	}{//l
		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;
	}
	printf("! %d %d %d %d %d %d %d %d\n",x1,y1,x2,y2,a1,b1,a2,b2);
	fflush(stdout);
	//for(;;);
	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<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[0]] && 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 <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];
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;
	//putchar('!');
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
	for(int k=0;k<2;k++)
	for(int p=0;p<2;p++){
		if(a[3][p]<=a[2][k] && a[1][j]<=a[0][i] && Query(a[3][p],a[1][j],a[2][k],a[0][i])==1){
			//tot++;
			//printf(" %d %d %d %d",a[3][p],a[1][j],a[2][k],a[0][i]);
			ans[i*4+0]=a[3][p];
			ans[i*4+1]=a[1][j];
			ans[i*4+2]=a[2][k];
			ans[i*4+3]=a[0][i];
			//tot++;
		}
	}
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	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<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[0]] && a[3][b[3]]>=a[2][1^b[2]]) 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<2;i++)
	for(int j=0;j<2;j++)
	for(int k=0;k<2;k++)
	for(int p=0;p<2;p++){
		if(a[3][p]<=a[2][k] && a[1][j]<=a[0][i] && Query(a[3][p],a[1][j],a[2][k],a[0][i])==1){
			//tot++;
			//printf(" %d %d %d %d",a[3][p],a[1][j],a[2][k],a[0][i]);
			int t;
			if(a[0][0]!=a[0][1]) t=i;
			else if(a[1][0]!=a[1][1]) t=j;
			else if(a[2][0]!=a[2][1]) t=k;
			else if(a[3][0]!=a[3][1]) t=p;
			ans[t*4+0]=a[3][p];
			ans[t*4+1]=a[1][j];
			ans[t*4+2]=a[2][k];
			ans[t*4+3]=a[0][i];
			//tot++;
		}
	}
	*/
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	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];
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;
	//putchar('!');
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
	for(int k=0;k<2;k++)
	for(int p=0;p<2;p++){
		if(a[3][p]<=a[2][k] && a[1][j]<=a[0][i] && Query(a[3][p],a[1][j],a[2][k],a[0][i])==1){
			//tot++;
			//printf(" %d %d %d %d",a[3][p],a[1][j],a[2][k],a[0][i]);
			int t;
			if(a[0][0]!=a[0][1]) t=i;
			else if(a[1][0]!=a[1][1]) t=j;
			else if(a[2][0]!=a[2][1]) t=k;
			else if(a[3][0]!=a[3][1]) t=p;
			else ans[t*4+0]=a[3][p];
			ans[t*4+1]=a[1][j];
			ans[t*4+2]=a[2][k];
			ans[t*4+3]=a[0][i];
			//tot++;
		}
	}
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	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 <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];
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;
	//putchar('!');
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
	for(int k=0;k<2;k++)
	for(int p=0;p<2;p++){
		if(a[3][p]<=a[2][k] && a[1][j]<=a[0][i] && Query(a[3][p],a[1][j],a[2][k],a[0][i])==1){
			//tot++;
			//printf(" %d %d %d %d",a[3][p],a[1][j],a[2][k],a[0][i]);
			int t;
			if(a[0][0]!=a[0][1]) t=i;
			else if(a[1][0]!=a[1][1]) t=j;
			else if(a[2][0]!=a[2][1]) t=k;
			else if(a[3][0]!=a[3][1]) t=p;
			ans[t*4+0]=a[3][p];
			ans[t*4+1]=a[1][j];
			ans[t*4+2]=a[2][k];
			ans[t*4+3]=a[0][i];
			//tot++;
		}
	}
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	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];
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;
	//putchar('!');
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
	for(int k=0;k<2;k++)
	for(int p=0;p<2;p++){
		if(a[3][p]<=a[2][k] && a[1][j]<=a[0][i] && Query(a[3][p],a[1][j],a[2][k],a[0][i])==1){
			//tot++;
			//printf(" %d %d %d %d",a[3][p],a[1][j],a[2][k],a[0][i]);
			int t;
			if(a[0][0]!=a[0][1]) t=i;
			if(a[1][0]!=a[1][1]) t=j;
			if(a[2][0]!=a[2][1]) t=k;
			if(a[3][0]!=a[3][1]) t=p;
			ans[t*4+0]=a[3][p];
			ans[t*4+1]=a[1][j];
			ans[t*4+2]=a[2][k];
			ans[t*4+3]=a[0][i];
			//tot++;
		}
	}
	putchar('!');
	for(int i=0;i<8;i++) printf(" %d",ans[i]);
	puts("");
	FL
	return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

bool check(int x)
{
    if (x < 1 || x > n) return true;
    else return false;
}

int que(ll x1, ll y1, ll x2, ll y2)
{
    if (check(x1) || check(x2) || check(y1) || check(y2)) return 0;
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, x2 / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, y2 / 2 + 1};
        ll xx2[4] = {x2 / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, y2 / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (i == 0) x2 = x2 / 2 ;
                if (i == 1) x1 = x2 / 2 + 1;
                if (i == 2) y2 = y2 / 2 ;
                if (i == 3) y1 = y2 / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

bool check(int x)
{
    if (x < 1 || x > n) return true;
    else return false;
}

int que(ll x1, ll y1, ll x2, ll y2)
{
    if (check(x1) || check(x2) || check(y1) || check(y2)) return 0;
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, (x1 + x2) / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, (y1 + y2) / 2 + 1};
        ll xx2[4] = {(x2 + x1) / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, (y1 + y2) / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (i == 0) x2 = (x2 + x1) / 2 ;
                if (i == 1) x1 = (x1 + x2) / 2 + 1;
                if (i == 2) y2 = (y1 + y2) / 2;
                if (i == 3) y1 = (y1 + y2) / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

bool check(int x)
{
    if (x < 1 && x > n) return true;
    else return false;
}

int que(ll x1, ll y1, ll x2, ll y2)
{
    if (check(x1) || check(x2) || check(y1) || check(y2)) return 0;
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, x2 / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, y2 / 2 + 1};
        ll xx2[4] = {x2 / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, y2 / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (i == 0) x2 = x2 / 2 ;
                if (i == 1) x1 = x2 / 2 + 1;
                if (i == 2) y2 = y2 / 2 ;
                if (i == 3) y1 = y2 / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    ll xx1[4] = {x1, x2 / 2, x1, x1};
    ll yy1[4] = {y1, y1, y1, y2 / 2};
    ll xx2[4] = {x2 / 2 + 1, x2, x2, x2};
    ll yy2[4] = {y2, y2, y2 / 2 + 1, y2};
    for (int i = 0; i < 4; i++)
    {
        int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
        if (t == 2)
        {
            if (i == 0) x2 = x2 / 2 + 1;
            if (i == 1) x1 = x2 / 2;
            if (i == 2) y2 = y2 / 2 + 1;
            if (i == 3) y1 = y2 / 2;
            break;
        }
        else
        if (t == 1)
        {
            sol(xx1[i], yy1[i], xx2[i], yy2[i]);
            sol2();
            break;
        }
    }
    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, x2 / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, y2 / 2 + 1};
        ll xx2[4] = {x2 / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, y2 / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (i == 0) x2 = x2 / 2 ;
                if (i == 1) x1 = x2 / 2 + 1;
                if (i == 2) y2 = y2 / 2 ;
                if (i == 3) y1 = y2 / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1, y2))
        x2 = ax1;
    else
    if (que(x1, y1, x2, ay1))
        y2 = ay1;
    else
    if (que(ax2, y1, x2, y2))
        x1= ax2;
    else
    if (que(x1, ay2, x2, y2))
        y1 = ay2;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    ll xx1[4] = {x1, x2 / 2, x1, x1};
    ll yy1[4] = {y1, y1, y1, y2 / 2};
    ll xx2[4] = {x2 / 2, x2, x2, x2};
    ll yy2[4] = {y2, y2, y2 / 2, y2};
    for (int i = 0; i < 4; i++)
    {
        int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
        if (t == 2)
        {
            if (i == 0) x2 /= 2;
            if (i == 1) x1 = x2 / 2;
            if (i == 2) y2 /= 2;
            if (i == 3) y1 = y2 / 2;
            break;
        }
        else
        if (t == 1)
        {
            sol(xx1[i], yy1[i], xx2[i], yy2[i]);
            sol2();
            break;
        }
    }
    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, x2 / 2, x1, x1};
        ll yy1[4] = {y1, y1, y1, y2 / 2};
        ll xx2[4] = {x2 / 2 + 1, x2, x2, x2};
        ll yy2[4] = {y2, y2, y2 / 2 + 1, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (i == 0) x2 = x2 / 2 + 1;
                if (i == 1) x1 = x2 / 2;
                if (i == 2) y2 = y2 / 2 + 1;
                if (i == 3) y1 = y2 / 2;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

bool check(int x)
{
    if (x < 1 || x > n) return true;
    else return false;
}

int que(ll x1, ll y1, ll x2, ll y2)
{
    if (check(x1) || check(x2) || check(y1) || check(y2)) return 0;
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, (x1 + x2) / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, (y1 + y2) / 2 + 1};
        ll xx2[4] = {(x2 + x1) / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, (y1 + y2) / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (xx1 == xx2) continue;
                if (yy1 == yy2) continue;
                if (i == 0) x2 = (x2 + x1) / 2 ;
                if (i == 1) x1 = (x1 + x2) / 2 + 1;
                if (i == 2) y2 = (y1 + y2) / 2;
                if (i == 3) y1 = (y1 + y2) / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

bool check(int x)
{
    if (x < 1 || x > n) return true;
    else return false;
}

int que(ll x1, ll y1, ll x2, ll y2)
{
    if (check(x1) || check(x2) || check(y1) || check(y2)) return 0;
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    while (1)
    {
        bool ok = true;
        ll xx1[4] = {x1, (x1 + x2) / 2 + 1, x1, x1};
        ll yy1[4] = {y1, y1, y1, (y1 + y2) / 2 + 1};
        ll xx2[4] = {(x2 + x1) / 2, x2, x2, x2};
        ll yy2[4] = {y2, y2, (y1 + y2) / 2, y2};
        for (int i = 0; i < 4; i++)
        {
            int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
            if (t == 2)
            {
                if (xx1[i] == xx2[i]) continue;
                if (yy1[i] == yy2[i]) continue;
                if (i == 0) x2 = (x2 + x1) / 2 ;
                if (i == 1) x1 = (x1 + x2) / 2 + 1;
                if (i == 2) y2 = (y1 + y2) / 2;
                if (i == 3) y1 = (y1 + y2) / 2 + 1;
                break;
            }
            else
            if (t == 1)
            {
                sol(xx1[i], yy1[i], xx2[i], yy2[i]);
                sol2();
                ok = false;
                break;
            }
            if (!ok) break;
        }
        if (!ok) break;
    }

    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    ll xx1[4] = {x1, x2 / 2 - 1, x1, x1};
    ll yy1[4] = {y1, y1, y1, y2 / 2 - 1};
    ll xx2[4] = {x2 / 2, x2, x2, x2};
    ll yy2[4] = {y2, y2, y2 / 2, y2};
    for (int i = 0; i < 4; i++)
    {
        int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
        if (t == 2)
        {
            if (i == 0) x2 /= 2;
            if (i == 1) x1 = x2 / 2;
            if (i == 2) y2 /= 2;
            if (i == 3) y1 = y2 / 2;
            break;
        }
        else
        if (t == 1)
        {
            sol(xx1[i], yy1[i], xx2[i], yy2[i]);
            sol2();
            break;
        }
    }
    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include <bits/stdc++.h>

#define ll long long
#define oo 1e18

const int N = 1e5 + 10;

using namespace std;

ll n, ax1, ax2, ay1, ay2, bx1, bx2, by1, by2;

int que(ll x1, ll y1, ll x2, ll y2)
{
    cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
    int u;
    cin >> u;
    fflush(stdout);
    return u;
}

void sol(ll x1, ll y1, ll x2, ll y2)
{
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            ax2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = ax2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, ax2, y2))
        {
            ax1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, y1, ax2, mid))
        {
            ay2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = ay2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(ax1, mid, ax2, ay2))
        {
            ay1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

void sol2()
{
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    if (que(x1, y1, ax1 - 1, y2))
        x2 = ax1 - 1;
    else
    if (que(x1, y1, x2, ay1 - 1))
        y2 = ay1 - 1;
    else
    if (que(ax2 + 1, y1, x2, y2))
        x1= ax2 + 1;
    else
    if (que(x1, ay2 + 1, x2, y2))
        y1 = ay2 + 1;
    ll d = x1, c = x2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(x1, y1, mid, y2))
        {
            bx2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = x1, c = bx2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(mid, y1, bx2, y2))
        {
            bx1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
    d = y1, c = y2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, y1, bx2, mid))
        {
            by2 = mid;
            c = mid - 1;
        }
        else
            d = mid + 1;
    }
    d = y1, c = by2;
    while (d <= c)
    {
        ll mid = (d + c) / 2;
        if (que(bx1, mid, bx2, by2))
        {
            by1 = mid;
            d = mid + 1;
        }
        else
            c = mid - 1;
    }
}

int main()
{
    //freopen("input.txt", "r", stdin);
    std :: ios :: sync_with_stdio (false);
    cin >> n;
    fflush(stdout);
    ll x1 = 1, y1 = 1, x2 = n, y2 = n;
    ll xx1[4] = {x1, x2 / 2, x1, x1};
    ll yy1[4] = {y1, y1, y1, y2 / 2};
    ll xx2[4] = {x2 / 2 + 1, x2, x2, x2};
    ll yy2[4] = {y2, y2, y2 / 2 + 1, y2};
    for (int i = 0; i < 4; i++)
    {
        int t = que(xx1[i], yy1[i], xx2[i], yy2[i]);
        if (t == 2)
        {
            if (i == 0) x2 /= 2;
            if (i == 1) x1 = x2 / 2;
            if (i == 2) y2 /= 2;
            if (i == 3) y1 = y2 / 2;
            break;
        }
        else
        if (t == 1)
        {
            sol(xx1[i], yy1[i], xx2[i], yy2[i]);
            sol2();
            break;
        }
    }
    cout << "! " << ax1 << " " << ay1 << " " << ax2 << " " << ay2 << " "
        << bx1 << " " << by1 << " " << bx2 << " " << by2 << endl;
    return 0;
}


#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
int n;

int find_down(int low,int high,bool isdown,int tar,bool isleft)
{
    int tmplow = low,tmphigh = high;
    int ans = (isdown)?low:high;
    int x;
    while(true)
    {
        int mid = (low+high)>>1;
        if(mid==low)
        {
            if(isdown)
            {
                if(isleft)
                    cout<<"? "<<high<<" 1 "<<tmphigh<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<high<<" "<<n<<" "<<tmphigh<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = high;
                    break;
                }
                else
                    break;
            }
            else
            {
                if(isleft)
                    cout<<"? "<<tmplow<<" 1 "<<low<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<tmplow<<" "<<n<<" "<<low<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = low;
                    break;
                }
                else
                    break;
            }

        }
        if(isdown)
        {
            if(isleft)
                cout<<"? "<<mid<<" 1 "<<tmphigh<<" "<<n<<endl;
            else
                cout<<"? 1 "<<mid<<" "<<n<<" "<<tmphigh<<endl;
            cin>>x;
            if(x==tar)
            {
                low = mid;
                ans = mid;
            }
            else
                high = mid;
        }
        else
        {
            if(isleft)
                cout<<"? "<<tmplow<<" 1 "<<mid<<" "<<n<<endl;
            else
                cout<<"? 1 "<<tmplow<<" "<<n<<" "<<mid<<endl;
            cin>>x;
            if(x==tar)
            {
                ans = mid;
                high = mid;
            }
            else
            {
                low = mid;
            }
        }
    }
    return ans;
}

int ansx[4],ansy[4];
typedef pair<int,int> P;
P xxx[4];
P yyy[4];
P G[maxn];
int cnt;

struct node
{
    int sx1 = 0,sx2 = 0;
    int sy1 = 0,sy2 = 0;
    node() {}
    node(int kx1,int ky1,int kx2,int ky2):
        sx1(kx1),sy1(ky1),sx2(kx2),sy2(ky2) {}
};

bool judge(const node &x,const node &y)
{
    int minx = max(x.sx1,y.sx1);
    int miny = max(x.sy1,y.sy1);
    int maxx = min(x.sx2,y.sx2);
    int maxy = min(x.sy2,y.sy2);
//    cout<<minx<<" "<<maxx<<" "<<miny<<" "<<maxy<<endl;
    int cha = min(abs(x.sx1-y.sx2),abs(x.sx2-y.sx1));
    if(cha<=1)
    {
        if(x.sy1 > y.sy2||x.sy2 < y.sy1)
            return true;
        return false;
    }
    if(minx > maxx || miny > maxy)
        return true;
    return false;
}

int query(int x1,int y1,int x2,int y2)
{
    int cnt;
    cout<<"? "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
    cin>>cnt;
    return cnt;
}
bool judge2(const node &x)
{
//    cout<<x.sx1<<" "<<x.sy1<<" "<<x.sx2<<" "<<x.sy2<<endl;
//    return true;
    if(x.sx1+1<=n&&x.sx1+1<=x.sx2&&query(x.sx1+1,x.sy1,x.sx2,x.sy2))
        return false;
    if(x.sx2-1>=1&&x.sx2-1>=x.sx1&&query(x.sx1,x.sy1,x.sx2-1,x.sy2))
        return false;
    if(x.sy1+1<=n&&x.sy1+1<=x.sy2&&query(x.sx1,x.sy1+1,x.sx2,x.sy2))
        return false;
    if(x.sx2-1>=1&&x.sx2-1>=x.sx1&&query(x.sx1,x.sy1,x.sx2,x.sy2-1))
        return false;
    return true;
}

int main()
{
    IO;
    cin>>n;
    int down = find_down(1,n,true,2,true);
    int up = find_down(1,n,false,2,true);
    int down2 = find_down(down,up,true,1,true);
    int up2 = find_down(down,up,false,1,true);
    xxx[0] = P(down,up2);
    xxx[1] = P(down2,up);
    xxx[2] = P(down,up);
    xxx[3] = P(down2,up2);
//    for(int i=0; i<4; i++)
//        cout<<ansx[i]<<" ";
//    cout<<endl;

    down = find_down(1,n,true,2,false);
    up = find_down(1,n,false,2,false);
    down2 = find_down(down,up,true,1,false);
    up2 = find_down(down,up,false,1,false);
    yyy[0] = P(down,up2);
    yyy[1] = P(down2,up);
    yyy[2] = P(down,up);
    yyy[3] = P(down2,up2);

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(xxx[i].first>xxx[i].second)
                swap(xxx[i].first,xxx[i].second);
            if(yyy[j].first>yyy[j].second)
                swap(yyy[j].first,yyy[j].second);
            cout<<"? "<<xxx[i].first<<" "<<yyy[j].first<<" "<<xxx[i].second<<" "<<yyy[j].second<<endl;
            int x;
            cin>>x;
            if(x==1)
            {
                G[cnt++] = P(i,j);
            }
        }
    }
//    for(int i=0; i<cnt; i++)
//    {
//        int a = G[i].first;
//        int b = G[i].second;
//        cout<<xxx[a].first<<" "<<yyy[b].first<<" "<<xxx[a].second<<" "<<yyy[b].second<<" | "<<a<<" "<<b<<endl;
//    }

    for(int i=0; i<cnt; i++)
    {
        for(int j=i+1; j<cnt; j++)
        {
            int ii = G[i].first;
            int jj = G[i].second;
            int si = G[j].first;
            int sj = G[j].second;
            node a = node(xxx[ii].first,yyy[jj].first,xxx[ii].second,yyy[jj].second);
            node b = node(xxx[si].first,yyy[sj].first,xxx[si].second,yyy[sj].second);
            if(judge(a,b)&&judge2(a)&&judge2(b))
            {
                cout<<"! ";
                cout<<xxx[ii].first<<" "<<yyy[jj].first<<" "<<xxx[ii].second<<" "<<yyy[jj].second<<" " ;
                cout<<xxx[si].first<<" "<<yyy[sj].first<<" "<<xxx[si].second<<" "<<yyy[sj].second<<endl;
                exit(0);
            }
        }
    }
    return 0;
}

/*
5
1
2
1
2
1
1
1
1
1
2
1
1
1
1
1
1
0
1
1
1
0
1
1
0
1
1
0
1
1
2
1
1
1
2
1
*/


#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
int n;

int find_down(int low,int high,bool isdown,int tar,bool isleft)
{
    int tmplow = low,tmphigh = high;
    int ans = (isdown)?low:high;
    int x;
    while(true)
    {
        int mid = (low+high)>>1;
        if(mid==low)
        {
            if(isdown)
            {
                if(isleft)
                    cout<<"? "<<high<<" 1 "<<tmphigh<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<high<<" "<<n<<" "<<tmphigh<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = high;
                    break;
                }
                else
                    break;
            }
            else
            {
                if(isleft)
                    cout<<"? "<<tmplow<<" 1 "<<low<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<tmplow<<" "<<n<<" "<<low<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = low;
                    break;
                }
                else
                    break;
            }

        }
        if(isdown)
        {
            if(isleft)
                cout<<"? "<<mid<<" 1 "<<tmphigh<<" "<<n<<endl;
            else
                cout<<"? 1 "<<mid<<" "<<n<<" "<<tmphigh<<endl;
            cin>>x;
            if(x==tar)
            {
                low = mid;
                ans = mid;
            }
            else
                high = mid;
        }
        else
        {
            if(isleft)
                cout<<"? "<<tmplow<<" 1 "<<mid<<" "<<n<<endl;
            else
                cout<<"? 1 "<<tmplow<<" "<<n<<" "<<mid<<endl;
            cin>>x;
            if(x==tar)
            {
                ans = mid;
                high = mid;
            }
            else
            {
                low = mid;
            }
        }
    }
    return ans;
}

int ansx[4],ansy[4];
typedef pair<int,int> P;
P xxx[4];
P yyy[4];
P G[maxn];
int cnt;

struct node
{
    int sx1 = 0,sx2 = 0;
    int sy1 = 0,sy2 = 0;
    node() {}
    node(int kx1,int ky1,int kx2,int ky2):
        sx1(kx1),sy1(ky1),sx2(kx2),sy2(ky2) {}
};

bool judge(const node &x,const node &y)
{
    int minx = max(x.sx1,y.sx1);
    int miny = max(x.sy1,y.sy1);
    int maxx = min(x.sx2,y.sx2);
    int maxy = min(x.sy2,y.sy2);
//    cout<<minx<<" "<<maxx<<" "<<miny<<" "<<maxy<<endl;
    int cha = min(abs(x.sx1-y.sx2),abs(x.sx2-y.sx1));
    if(cha<=1)
    {
        if(x.sy1 > y.sy2||x.sy2 < y.sy1)
            return true;
        return false;
    }
    if(minx > maxx || miny > maxy)
        return true;
    return false;
}

int query(int x1,int y1,int x2,int y2)
{
    int cnt;
    cout<<"? "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
    cin>>cnt;
    return cnt;
}
bool judge2(const node &x)
{
//    cout<<x.sx1<<" "<<x.sy1<<" "<<x.sx2<<" "<<x.sy2<<endl;
//    return true;
    if(x.sx1+1<=n&&x.sx1+1<=x.sx2&&query(x.sx1+1,x.sy1,x.sx2,x.sy2))
        return false;
    if(x.sx2-1>=1&&x.sx2-1>=x.sx1&&query(x.sx1,x.sy1,x.sx2-1,x.sy2))
        return false;
    if(x.sy1+1<=n&&x.sy1+1<=x.sy2&&query(x.sx1,x.sy1+1,x.sx2,x.sy2))
        return false;
    if(x.sy2-1>=1&&x.sy2-1>=x.sy1&&query(x.sx1,x.sy1,x.sx2,x.sy2-1))
        return false;
    return true;
}

int main()
{
    IO;
    cin>>n;
    int down = find_down(1,n,true,2,true);
    int up = find_down(1,n,false,2,true);
    int down2 = find_down(down,up,true,1,true);
    int up2 = find_down(down,up,false,1,true);
    xxx[0] = P(down,up2);
    xxx[1] = P(down2,up);
    xxx[2] = P(down,up);
    xxx[3] = P(down2,up2);
//    for(int i=0; i<4; i++)
//        cout<<ansx[i]<<" ";
//    cout<<endl;

    down = find_down(1,n,true,2,false);
    up = find_down(1,n,false,2,false);
    down2 = find_down(down,up,true,1,false);
    up2 = find_down(down,up,false,1,false);
    yyy[0] = P(down,up2);
    yyy[1] = P(down2,up);
    yyy[2] = P(down,up);
    yyy[3] = P(down2,up2);

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(xxx[i].first>xxx[i].second)
                swap(xxx[i].first,xxx[i].second);
            if(yyy[j].first>yyy[j].second)
                swap(yyy[j].first,yyy[j].second);
            cout<<"? "<<xxx[i].first<<" "<<yyy[j].first<<" "<<xxx[i].second<<" "<<yyy[j].second<<endl;
            int x;
            cin>>x;
            if(x==1)
            {
                G[cnt++] = P(i,j);
            }
        }
    }
//    for(int i=0; i<cnt; i++)
//    {
//        int a = G[i].first;
//        int b = G[i].second;
//        cout<<xxx[a].first<<" "<<yyy[b].first<<" "<<xxx[a].second<<" "<<yyy[b].second<<" | "<<a<<" "<<b<<endl;
//    }

    for(int i=0; i<cnt; i++)
    {
        for(int j=i+1; j<cnt; j++)
        {
            int ii = G[i].first;
            int jj = G[i].second;
            int si = G[j].first;
            int sj = G[j].second;
            node a = node(xxx[ii].first,yyy[jj].first,xxx[ii].second,yyy[jj].second);
            node b = node(xxx[si].first,yyy[sj].first,xxx[si].second,yyy[sj].second);
            if(judge(a,b)&&judge2(a)&&judge2(b))
            {
                cout<<"! ";
                cout<<xxx[ii].first<<" "<<yyy[jj].first<<" "<<xxx[ii].second<<" "<<yyy[jj].second<<" " ;
                cout<<xxx[si].first<<" "<<yyy[sj].first<<" "<<xxx[si].second<<" "<<yyy[sj].second<<endl;
                exit(0);
            }
        }
    }
    return 0;
}

/*
5
1
2
1
2
1
1
1
1
1
2
1
1
1
1
1
1
0
1
1
1
0
1
1
0
1
1
0
1
1
2
1
1
1
2
1
*/


#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
int n;

int find_down(int low,int high,bool isdown,int tar,bool isleft)
{
    int tmplow = low,tmphigh = high;
    int ans = (isdown)?low:high;
    int x;
    while(true)
    {
        int mid = (low+high)>>1;
        if(mid==low)
        {
            if(isdown)
            {
                if(isleft)
                    cout<<"? "<<high<<" 1 "<<tmphigh<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<high<<" "<<n<<" "<<tmphigh<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = high;
                    break;
                }
                else
                    break;
            }
            else
            {
                if(isleft)
                    cout<<"? "<<tmplow<<" 1 "<<low<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<tmplow<<" "<<n<<" "<<low<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = low;
                    break;
                }
                else
                    break;
            }

        }
        if(isdown)
        {
            if(isleft)
                cout<<"? "<<mid<<" 1 "<<tmphigh<<" "<<n<<endl;
            else
                cout<<"? 1 "<<mid<<" "<<n<<" "<<tmphigh<<endl;
            cin>>x;
            if(x==tar)
            {
                low = mid;
                ans = mid;
            }
            else
                high = mid;
        }
        else
        {
            if(isleft)
                cout<<"? "<<tmplow<<" 1 "<<mid<<" "<<n<<endl;
            else
                cout<<"? 1 "<<tmplow<<" "<<n<<" "<<mid<<endl;
            cin>>x;
            if(x==tar)
            {
                ans = mid;
                high = mid;
            }
            else
            {
                low = mid;
            }
        }
    }
    return ans;
}

int ansx[4],ansy[4];
typedef pair<int,int> P;
P xxx[4];
P yyy[4];
P G[maxn];
int cnt;

struct node
{
    int sx1 = 0,sx2 = 0;
    int sy1 = 0,sy2 = 0;
    node() {}
    node(int kx1,int ky1,int kx2,int ky2):
        sx1(kx1),sy1(ky1),sx2(kx2),sy2(ky2) {}
};

bool judge(const node &x,const node &y)
{
    int minx = max(x.sx1,y.sx1);
    int miny = max(x.sy1,y.sy1);
    int maxx = min(x.sx2,y.sx2);
    int maxy = min(x.sy2,y.sy2);
//    cout<<minx<<" "<<maxx<<" "<<miny<<" "<<maxy<<endl;
    int cha = min(abs(x.sx1-y.sx2),abs(x.sx2-y.sx1));
    if(cha<=1)
    {
        if(x.sy1 > y.sy2||x.sy2 < y.sy1)
            return true;
        return false;
    }
    if(minx > maxx || miny > maxy)
        return true;
    return false;
}

int main()
{
    IO;
    cin>>n;
    int down = find_down(1,n,true,2,true);
    int up = find_down(1,n,false,2,true);
    int down2 = find_down(down,up,true,1,true);
    int up2 = find_down(down,up,false,1,true);
    xxx[0] = P(down,up2);
    xxx[1] = P(down2,up);
    xxx[2] = P(down,up);
    xxx[3] = P(down2,up2);
//    for(int i=0; i<4; i++)
//        cout<<ansx[i]<<" ";
//    cout<<endl;

    down = find_down(1,n,true,2,false);
    up = find_down(1,n,false,2,false);
    down2 = find_down(down,up,true,1,false);
    up2 = find_down(down,up,false,1,false);
    yyy[0] = P(down,up2);
    yyy[1] = P(down2,up);
    yyy[2] = P(down,up);
    yyy[3] = P(down2,up2);

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(xxx[i].first>xxx[i].second)
                swap(xxx[i].first,xxx[i].second);
            if(yyy[j].first>yyy[j].second)
                swap(yyy[j].first,yyy[j].second);
            cout<<"? "<<xxx[i].first<<" "<<yyy[j].first<<" "<<xxx[i].second<<" "<<yyy[j].second<<endl;
            int x;
            cin>>x;
            if(x==1)
            {
                G[cnt++] = P(i,j);
            }
        }
    }
    //    for(int i=0; i<cnt; i++)
//    {
//        int a = G[i].first;
//        int b = G[i].second;
//        cout<<xxx[a].first<<" "<<yyy[b].first<<" "<<xxx[a].second<<" "<<yyy[b].second<<" | "<<a<<" "<<b<<endl;
//    }
    for(int i=0; i<cnt; i++)
    {
        for(int j=i+1; j<cnt; j++)
        {
            int ii = G[i].first;
            int jj = G[i].second;
            int si = G[j].first;
            int sj = G[j].second;
            node a = node(xxx[ii].first,yyy[jj].first,xxx[ii].second,yyy[jj].second);
            node b = node(xxx[si].first,yyy[sj].first,xxx[si].second,yyy[sj].second);
            if(judge(a,b))
            {
                cout<<"! ";
                cout<<xxx[ii].first<<" "<<yyy[jj].first<<" "<<xxx[ii].second<<" "<<yyy[jj].second<<" " ;
                cout<<xxx[si].first<<" "<<yyy[sj].first<<" "<<xxx[si].second<<" "<<yyy[sj].second<<endl;
                exit(0);
            }
        }
    }
    return 0;
}

/*
5
1
2
1
2
1
1
1
1
1
2
1
1
1
1
1
1
0
1
1
1
0
1
1
0
1
1
0
1
1
2
1
1
1
2
1
*/


#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
int n;

int find_down(int low,int high,bool isdown,int tar,bool isleft)
{
    int tmplow = low,tmphigh = high;
    int ans = (isdown)?low:high;
    int x;
    while(true)
    {
        int mid = (low+high)>>1;
        if(mid==low)
        {
            if(isdown)
            {
                if(isleft)
                    cout<<"? "<<high<<" 1 "<<tmphigh<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<high<<" "<<n<<" "<<tmphigh<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = high;
                    break;
                }
                else
                    break;
            }
            else
            {
                if(isleft)
                    cout<<"? "<<tmplow<<" 1 "<<low<<" "<<n<<endl;
                else
                    cout<<"? 1 "<<tmplow<<" "<<n<<" "<<low<<endl;
                cin>>x;
                if(x==tar)
                {
                    ans = low;
                    break;
                }
                else
                    break;
            }

        }
        if(isdown)
        {
            if(isleft)
                cout<<"? "<<mid<<" 1 "<<tmphigh<<" "<<n<<endl;
            else
                cout<<"? 1 "<<mid<<" "<<n<<" "<<tmphigh<<endl;
            cin>>x;
            if(x==tar)
            {
                low = mid;
                ans = mid;
            }
            else
                high = mid;
        }
        else
        {
            if(isleft)
                cout<<"? "<<tmplow<<" 1 "<<mid<<" "<<n<<endl;
            else
                cout<<"? 1 "<<tmplow<<" "<<n<<" "<<mid<<endl;
            cin>>x;
            if(x==tar)
            {
                ans = mid;
                high = mid;
            }
            else
            {
                low = mid;
            }
        }
    }
    return ans;
}

int ansx[4],ansy[4];
typedef pair<int,int> P;
P xxx[4];
P yyy[4];
P G[maxn];
int cnt;

int main()
{
    IO;
    cin>>n;
    int down = find_down(1,n,true,2,true);
    int up = find_down(1,n,false,2,true);
    int down2 = find_down(down,up,true,1,true);
    int up2 = find_down(down,up,false,1,true);
    xxx[0] = P(down,up2);
    xxx[1] = P(down2,up);
    xxx[2] = P(down,up);
    xxx[3] = P(down2,up2);
//    for(int i=0; i<4; i++)
//        cout<<ansx[i]<<" ";
//    cout<<endl;

    down = find_down(1,n,true,2,false);
    up = find_down(1,n,false,2,false);
    down2 = find_down(down,up,true,1,false);
    up2 = find_down(down,up,false,1,false);
    yyy[0] = P(down,up2);
    yyy[1] = P(down2,up);
    yyy[2] = P(down,up);
    yyy[3] = P(down2,up2);

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(xxx[i].first>xxx[i].second)
                swap(xxx[i].first,xxx[i].second);
            if(yyy[j].first>yyy[j].second)
                swap(yyy[j].first,yyy[j].second);
            cout<<"? "<<xxx[i].first<<" "<<yyy[j].first<<" "<<xxx[i].second<<" "<<yyy[j].second<<endl;
            int x;
            cin>>x;
            if(x==1)
            {
                G[cnt++] = P(i,j);
            }
        }
    }
    for(int i=0; i<cnt; i++)
    {
        for(int j=i+1; j<cnt; j++)
        {
            unordered_set<int> sk;
            sk.insert(G[i].first);
            sk.insert(G[i].second);
            sk.insert(G[j].first);
            sk.insert(G[j].second);
            if(sk.size()==4)
            {
                cout<<"! ";
                int ii = G[i].first;
                int jj = G[i].second;
                int si = G[j].first;
                int sj = G[j].second;
                cout<<xxx[ii].first<<" "<<yyy[jj].first<<" "<<xxx[ii].second<<" "<<yyy[jj].second<<" " ;
                cout<<xxx[si].first<<" "<<yyy[sj].first<<" "<<xxx[si].second<<" "<<yyy[sj].second<<endl;
                exit(0);
            }
        }
    }
//    cout<<down<<" "<<up<<" "<<down2<<" "<<up2<<endl;
    return 0;
}