#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k, tot;
vector<ii> ans;
map<pair<ii, ii>, int> mpx;

int ask(int x, int y, int xx, int yy) {
	if(mpx.count({{x, y}, {xx, yy}}) != 0)
		return mpx[{{x, y}, {xx, yy}}];
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	mpx[{{x, y}, {xx, yy}}] = re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans.pb({x, col});
		return;
	}
	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans.pb({row, x});
		return;
	}
	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	int st = 1;
	bool fl = false;
	for(int i = 1; i <= n; i++) {
		if(fl && ans.size() == 1 && i == n) {
			bs2(i, 1, n);
			break;
		}
		if(ask(st, 1, i, n) % 2 == 1) {
			bs2(i, 1, n);
			st = i + 1;
			fl = true;
		}
	}

	if(ans.size() == 2) {
		cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
		return 0;
	}

	st = 1;
	for(int i = 1; i <= n; i++) {
		if(fl && ans.size() == 1 && i == n) {
			bs1(i, 1, n);
			break;
		}
		if(ask(1, st, n, i) % 2 == 1) {
			bs1(i, 1, n);
			st = i + 1;
			fl = true;
		}
	}

	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k, tot;
vector<ii> ans(2);

int ask(int x, int y, int xx, int yy) {
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans[0].fi = x;
		ans[1].fi = x;
		return;
	}
	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans[0].se = x;
		ans[1].se = x;
		return;
	}
	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	int st = 1;
	int ind = 0;
	for(int i = 1; i <= n; i++)
		if(ask(1, st, n, i) % 2 == 1) {
			st = i + 1;
			ans[ind++].se = i;
		}
	st = 1;
	ind = 0;
	for(int i = 1; i <= n; i++)
		if(ask(st, 1, i, n) % 2 == 1) {
			st = i + 1;
			ans[ind++].fi = i;
		}

	if(ans[0].fi == 0)
		bs1(ans[0].se, 1, n);
	else if(ans[0].se == 0)
		bs2(ans[0].fi, 1, n);
	assert(ans[0].fi && ans[0].se && ans[1].fi && ans[1].se);
	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k, tot;
vector<ii> ans;

int ask(int x, int y, int xx, int yy) {
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans.pb({x, col});
		return;
	}
	tot++;
	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans.pb({row, x});
		return;
	}
	tot++;
	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	int st = 1;
	bool fl = false;
	for(int i = 1; i <= n; i++)
		if(fl && ans.size() == 1 && i == n) {
			bs1(i, 1, n);
			break;
		}
		if(ask(1, st, n, i) % 2 == 1) {
			bs1(i, 1, n);
			st = i + 1;
			fl = true;
		}
	if(ans.size() == 2) {
		cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
		return 0;
	}

	st = 1;
	for(int i = 1; i <= n; i++)
		if(fl && ans.size() == 1 && i == n) {
			bs2(i, 1, n);
			break;
		}
		if(ask(st, 1, i, n) % 2 == 1) {
			bs2(i, 1, n);
			st = i + 1;
			fl = true;
		}
	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k, tot;
vector<ii> ans(2);

int ask(int x, int y, int xx, int yy) {
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans[0].fi = x;
		ans[1].fi = x;
		return;
	}
	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans[0].se = x;
		ans[1].se = x;
		return;
	}
	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	int st = 1;
	int ind = 0;
	for(int i = 1; i <= n; i++)
		if(ask(1, st, n, i) % 2 == 1) {
			st = i + 1;
			ans[ind++].se = i;
		}
	st = 1;
	ind = 0;
	for(int i = 1; i <= n; i++)
		if(ask(st, 1, i, n) % 2 == 1) {
			st = i + 1;
			ans[ind++].fi = i;
		}

	if(ans[0].fi == 0)
		bs1(ans[0].se, 1, n);
	else if(ans[0].se == 0)
		bs2(ans[0].fi, 1, n);
	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y - 1) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k;
vector<ii> ans;

int ask(int x, int y, int xx, int yy) {
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans.pb({x, col});
		return;
	}

	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans.pb({row, x});
		return;
	}

	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	int st = 1;
	for(int i = 1; i <= n; i++)
		if(ask(1, st, n, i) % 2 == 1) {
			bs1(i, 1, n);
			st = i + 1;
		}
	if(ans.size() == 2) {
		cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
		return 0;
	}
	st = 1;
	for(int i = 1; i <= n; i++)
		if(ask(st, 1, i, n) % 2 == 1) {
			bs2(i, 1, n);
			st = i + 1;
		}
	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include <bits/stdc++.h>
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mid ((x + y) / 2)
#define left (ind * 2)
#define right (ind * 2 + 1)
#define mp make_pair
#define timer ((double)clock() / CLOCKS_PER_SEC)
#define endl "\n"
#define spc " "
#define d1(x) cerr<<#x<<":"<<x<<endl
#define d2(x, y) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<endl
#define d3(x, y, z) cerr<<#x<<":"<<x<<" "<<#y<<":"<<y<<" "<<#z<<":"<<z<<endl
#define fast_io() ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;

typedef long long int lli;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<double, double> dd;

const int N = (int)(1e6 + 5);
const int LOG = (int)(20);

int n, k, tot;
vector<ii> ans;
map<pair<ii, ii>, int> mpx;

int ask(int x, int y, int xx, int yy) {
	if(mpx.count({{x, y}, {xx, yy}}) != 0)
		return mpx[{{x, y}, {xx, yy}}];
	int re;
	cout << "?" << spc << x << spc << y << spc << xx << spc << yy << endl << flush;
	cin >> re;
	mpx[{{x, y}, {xx, yy}}] = re;
	return re;
}

void bs1(int col, int x, int y) {
	if(x >= y) {
		ans.pb({x, col});
		return;
	}
	if(ask(1, col, mid, col) % 2 == 1)
		bs1(col, x, mid);
	else
		bs1(col, mid + 1, y);
}

void bs2(int row, int x, int y) {
	if(x >= y) {
		ans.pb({row, x});
		return;
	}
	if(ask(row, 1, row, mid) % 2 == 1)
		bs2(row, x, mid);
	else
		bs2(row, mid + 1, y);
}

int main() {
	fast_io();
	// freopen("inp.in", "r", stdin);

	cin >> n;

	st = 1;
	for(int i = 1; i <= n; i++) {
		if(fl && ans.size() == 1 && i == n) {
			bs2(i, 1, n);
			break;
		}
		if(ask(st, 1, i, n) % 2 == 1) {
			bs2(i, 1, n);
			st = i + 1;
			fl = true;
		}
	}

	int st = 1;
	bool fl = false;
	for(int i = 1; i <= n; i++) {
		if(fl && ans.size() == 1 && i == n) {
			bs1(i, 1, n);
			break;
		}
		if(ask(1, st, n, i) % 2 == 1) {
			bs1(i, 1, n);
			st = i + 1;
			fl = true;
		}
	}
	if(ans.size() == 2) {
		cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
		return 0;
	}

	cout << "!" << spc << ans[0].fi << spc << ans[0].se << spc << ans[1].fi << spc << ans[1].se << endl << flush;
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;

int x[maxn],y[maxn];
int n;
int main(){
	int now;

	int n;scanf("%d",&n);
	int px = 0 , py = 0;
	for(int i = 1 ; i <= n ; i++){
		printf("? 1 %d %d %d\n",i,n,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= n ; i++){
		printf("? %d 1 %d %d\n",i,i,n);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}
	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1],x[1],y[1]);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("!%d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("!%d %d %d %d\n",x[1],y[1],x[2],y[2]);
		fflush(stdout);
	}
	else if(px == 2 && py == 0){
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],1,x[1],mid);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
	}
	else{
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",1,y[1],mid,y[1]);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
	}
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;

int x[maxn],y[maxn];
int n;
int main(){
	int now;

	int n;scanf("%d",&n);
	int px = 0 , py = 0;
	for(int i = 1 ; i <= n ; i++){
		printf("? 1 %d %d %d\n",i,n,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= n ; i++){
		printf("? %d 1 %d %d\n",i,i,n);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}
	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1],x[1],y[1]);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("!%d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("!%d %d %d %d\n",x[1],y[1],x[2],y[2]);
		fflush(stdout);
	}
	else if(px == 2){
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],mid,x[1],mid);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
	}
	else{
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",mid,y[1],mid,y[1]);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
	}
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 5;

int x[maxn],y[maxn];

int main(){
	int now;
	int px = 0 , py = 0;
	for(int i = 1 ; i <= 1000 ; i++){
		printf("? 1 %d 1000 %d\n",i,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= 1000 ; i++){
		printf("? %d 1 %d 1000\n",i,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}
	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1]);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("!%d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("!%d %d %d %d\n",x[1],y[1],x[2],y[2]);
	}
	else if(px == 2){
		int l = 1 , r = 1000 , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],mid,x[2],mid);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
	}
	else{
		int l = 1 , r = 1000 , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",mid,y[1],mid,y[2]);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
	}
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;

int x[maxn],y[maxn];
int n;
int main(){
	int now;

	int n;scanf("%d",&n);
	int px = 0 , py = 0;
	for(int i = 1 ; i <= n ; i++){
		printf("? 1 %d %d %d\n",i,n,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= n ; i++){
		printf("? %d 1 %d %d\n",i,i,n);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}

	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1],x[1],y[1]);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("! %d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("! %d %d %d %d\n",x[1],y[1],x[2],y[2]);
		fflush(stdout);
	}
	else if(px == 2 && py == 0){
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],1,x[1],mid);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
		fflush(stdout);
	}
	else{
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",1,y[1],mid,y[1]);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
		fflush(stdout);
	}
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;

int x[maxn],y[maxn];
int n;
int main(){
	int now;

	int n;scanf("%d",&n);
	int px = 0 , py = 0;
	for(int i = 1 ; i <= n ; i++){
		printf("? 1 %d %d %d\n",i,n,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= n ; i++){
		printf("? %d 1 %d %d\n",i,i,n);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}
	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1],x[1],y[1]);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("!%d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("!%d %d %d %d\n",x[1],y[1],x[2],y[2]);
	}
	else if(px == 2){
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],mid,x[1],mid);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
	}
	else{
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",mid,y[1],mid,y[1]);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
	}
}


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;

int x[maxn],y[maxn];
int n;
int main(){
	int now;

	int n;scanf("%d",&n);
	int px = 0 , py = 0;
	for(int i = 1 ; i <= n ; i++){
		printf("? 1 %d %d %d\n",i,n,i);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)y[++py] = i;
	}
	for(int i = 1 ; i <= n ; i++){
		printf("? %d 1 %d %d\n",i,i,n);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 1)x[++px] = i;
	}

	if(px == 2 && py == 2){
		printf("? %d %d %d %d\n",x[1],y[1],x[1],y[1]);
		fflush(stdout);
		scanf(" %d",&now);
		if(now % 2 == 0)printf("!%d %d %d %d\n",x[2],y[1],x[1],y[2]);
		else printf("!%d %d %d %d\n",x[1],y[1],x[2],y[2]);
		fflush(stdout);
	}
	else if(px == 2 && py == 0){
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",x[1],1,x[1],mid);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",x[1],ans,x[2],ans);
		fflush(stdout);
	}
	else{
		int l = 1 , r = n , mid , ans;
		while(l <= r){
			mid = (l + r) / 2;
			printf("? %d %d %d %d\n",1,y[1],mid,y[1]);
			fflush(stdout);
			scanf(" %d",&now);
			if(now % 2 == 1){
				r = mid - 1;
				ans = mid;
			}
			else
				l = mid + 1;
		}
		printf("! %d %d %d %d\n",ans,y[1],ans,y[2]);
		fflush(stdout);
	}
}


#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

vector<P> res;
int n;
int query(int x1, int y1, int x2, int y2){
	cout.flush();
	cout << "?" << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
	int t;
	cin >> t;
	return t;
}

void go_row(int row){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(l, row, mid, row);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(f, row));
}

void go_col(int col){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(col, l, col, mid);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(col, f));
}

int main(){
	cin >> n;

	vector<int> cnt(n + 1);
	for(int i = 1; i <= n; i++){
		int t = query(1, i, n, i);
		cnt[i] = t;
	}
	vector<int> found;
	for(int i = 1; i <= n; i++){
		if(cnt[i] & 1){
			found.push_back(i);
		}
	}
	if(found.size() == 2){
		for(auto d : found){
			go_row(d);
		}
	} else {
		for(int i = 1; i <= n; i++){
			int t = query(i, 1, i, n);
			cnt[i] = t;
		}
		found.clear();
		for(int i = 1; i <= n; i++){
			if(cnt[i] & 1){
				found.push_back(i);
			}
		}
		for(auto d : found){
			go_col(d);
		}
	}

	cout << "!" << " ";
	for(auto d : res){
		cout << d.first << " " << d.second << " ";
	}
}


#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

vector<P> res;
int n;
int query(int x1, int y1, int x2, int y2){
	cout.flush();
	cout << "?" << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
	int t;
	cin >> t;
	if(t == -1){
		cout << "! f**k" << endl;
	}
	return t;
}

void go_row(int row){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(l, row, mid, row);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(f, row));
}

void go_col(int col){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(col, l, col, mid);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(col, f));
}

int main(){
	cin >> n;

	vector<int> cnt(n + 1);
	for(int i = 1; i <= n; i++){
		int t = query(1, i, n, i);
		cnt[i] = t;
	}
	vector<int> found;
	for(int i = 1; i <= n; i++){
		if(cnt[i] & 1){
			found.push_back(i);
		}
	}
	if(found.size() == 2){
		for(auto d : found){
			go_row(d);
		}
	} else {
		for(int i = 1; i <= n; i++){
			int t = query(i, 1, i, n);
			cnt[i] = t;
		}
		found.clear();
		for(int i = 1; i <= n; i++){
			if(cnt[i] & 1){
				found.push_back(i);
			}
		}
		for(auto d : found){
			go_col(d);
		}
	}

	cout << "!" << " ";
	for(auto d : res){
		cout << d.first << " " << d.second << " ";
	}
}


#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

vector<P> res;
int n;
int query(int x1, int y1, int x2, int y2){
	cout.flush();
	cout << "?" << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
	int t;
	cin >> t;
	return t;
}

void go_row(int row){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(l, row, mid, row);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(f, row));
}

void go_col(int col){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(col, l, col, mid);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(col, f));
}

int main(){
	cin >> n;

	vector<int> cnt(n + 1);
	for(int i = 1; i <= n; i++){
		int t = query(1, i, n, i);
		cnt[i] = t;
	}
	vector<int> found;
	for(int i = 1; i <= n; i++){
		if(cnt[i] & 1){
			found.push_back(i);
		}
	}
	if(found.size() == 2){
		for(auto d : found){
			go_row(d);
		}
	} else {
		for(int i = 1; i <= n; i++){
			int t = query(i, 1, i, n);
			cnt[i] = t;
		}
		found.clear();
		for(int i = 1; i <= n; i++){
			if(cnt[i] & 1){
				found.push_back(i);
			}
		}
		for(auto d : found){
			go_col(d);
		}
	}

	cout << "!" << " ";
	for(auto d : res){
		cout << d.first << " " << d.second << " ";
	}
	if(res.empty()){
		cout << "-1" << endl;
	}
}


#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

vector<P> res;
int n;
int query(int x1, int y1, int x2, int y2){
	cout.flush();
	cout << "?" << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
	int t;
	cin >> t;
	return t;
}

void go_row(int row){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(l, row, mid, row);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(f, row));
}

void go_cnt(int cnt){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(cnt, l, cnt, mid);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(cnt, f));
}

int main(){
	cin >> n;

	vector<int> cnt(n + 1);
	for(int i = 1; i <= n; i++){
		int t = query(1, i, n, i);
		cnt[i] = t;
	}
	vector<int> found;
	for(int i = 1; i <= n; i++){
		if(cnt[i] & 1){
			found.push_back(i);
		}
	}
	if(found.size() == 2){
		for(auto d : found){
			go_row(d);
		}
	} else {
		for(int i = 1; i <= n; i++){
			int t = query(i, 1, i, n);
			cnt[i] = t;
		}
		found.clear();
		for(int i = 1; i <= n; i++){
			if(cnt[i] & 1){
				found.push_back(i);
			}
		}
		for(auto d : found){
			go_cnt(d);
		}
	}

	cout << "!" << " ";
	for(auto d : res){
		cout << d.first << " " << d.second << " ";
	}
}


#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

vector<P> res;
int n;

int query(int x1, int y1, int x2, int y2){
	cout.flush();
	cout << "?" << " " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
	int t;
	cin >> t;
	return t;
}

void go_row(int row){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(l, row, mid, row);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(f, row));
}

void go_col(int col){
	int l = 1, r = n, mid, f;
	while(l <= r){
		mid = (l + r) / 2;
		int t = query(col, l, col, mid);
		if(t & 1){
			r = mid - 1;
			f = mid;
		} else {
			l = mid + 1;
		}
	}
	res.push_back(P(col, f));
}

int main(){
	cin >> n;

	vector<int> cnt(n + 1);
	int s = 0;
	for(int i = 1; i < n; i++){
		int t = query(1, i, n, i);
		cnt[i] = t;
		s += t;
	}
	cnt[n] = s;
	vector<int> found;
	for(int i = 1; i <= n; i++){
		if(cnt[i] & 1){
			found.push_back(i);
		}
	}
	if(found.size() == 2){
		for(auto d : found){
			go_row(d);
		}
	} else {
		s = 0;
		for(int i = 1; i < n; i++){
			int t = query(i, 1, i, n);
			cnt[i] = t;
			s += t;
		}
		cnt[n] = s;
		found.clear();
		for(int i = 1; i <= n; i++){
			if(cnt[i] & 1){
				found.push_back(i);
			}
		}
		for(auto d : found){
			go_col(d);
		}
	}

	cout << "!" << " ";
	for(auto d : res){
		cout << d.first << " " << d.second << " ";
	}
}


#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
int n;
set<pair<int, int> > st;
void gao1(int r) {
	int L = 1, R = n, Mid, res, tmp = inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, 1, r, Mid);
		fflush(stdout);
		scanf("%d", &res);
		if(res & 1) {
			R = Mid - 1;
			if(res == 1) tmp = min(tmp, Mid);
		} else L = Mid + 1;
	}
	if(tmp != inf) st.insert({r, tmp});
}
void gao2(int r) {
	int L = 1, R = n, Mid, res, tmp = -inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, Mid, r, n);
		fflush(stdout);
		scanf("%d", &res);
		if(res & 1) {
			L = Mid + 1;
			if(res == 1) tmp = max(tmp, Mid);
		} else R = Mid - 1;
	}
	if(tmp != -inf) st.insert({r, tmp});
}

void output() {
	printf("!");
	for(set<pair<int, int> >::iterator it = st.begin(); it != st.end(); it++) {
		int x = (*it).first, y = (*it).second;
		printf(" %d %d", x, y);
	}
	puts("");
	fflush(stdout);
}

int main() {
	scanf("%d", &n);
	int r1 = 0, r2 = 0;
	for(int i = 1, tmp; i <= n; i++) {
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		scanf("%d", &tmp);
		if(tmp > 0) {
			r1 = i;
			break;
		}
	}
	if(r1) {
		for(int i = n, tmp; i >= 1; i--) {
			printf("? %d %d %d %d\n", i, 1, i, n);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp > 0) {
				r2 = i;
				break;
			}
		}
	}
	if(r1 && r2) {
		gao1(r1), gao2(r1);
		gao1(r2), gao2(r2);
	} else {
		int c1, c2, tmp;
		for(c1 = 1; ; c1++) {
			printf("? %d %d %d %d\n", 1, 1, n, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		for(c2 = n; ; c2--) {
			printf("? %d %d %d %d\n", 1, n, n, c2);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		int L = 1, R = n, Mid, r3 = inf;
		while(L <= R) {
			Mid = (L + R) >> 1;
			printf("? %d %d %d %d\n", 1, 1, Mid, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) r3 = min(r3, Mid), R = Mid - 1;
			else L = Mid + 1;
		}
		st.insert({r3, c1});
		st.insert({r3, c2});
	}
	output();
}


#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;

const int inf = 0x3f3f3f3f;

int n;
set<pair<int, int> > st;

void gao1(int r) {
	int L = 1, R = n, Mid, res, tmp = inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, 1, r, Mid);
		fflush(stdout);
		scanf("%d", &res);
		if(res >= 1) {
			R = Mid - 1;
			if(res == 1) tmp = min(tmp, Mid);
		} else L = Mid + 1;
	}
	if(tmp != inf) st.insert({r, tmp});
}

void gao2(int r) {
	int L = 1, R = n, Mid, res, tmp = -inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, Mid, r, n);
		fflush(stdout);
		scanf("%d", &res);
		if(res >= 1) {
			L = Mid + 1;
			if(res == 1) tmp = max(tmp, Mid);
		} else R = Mid - 1;
	}
	if(tmp != -inf) st.insert({r, tmp});
}

void output() {
	printf("!");
	for(set<pair<int, int> >::iterator it = st.begin(); it != st.end(); it++) {
		int x = (*it).first, y = (*it).second;
		printf(" %d %d", x, y);
	}
	puts("");
	fflush(stdout);
}

int main() {
	scanf("%d", &n);
	int r1 = 0, r2 = 0;
	for(int i = 1, tmp; i <= n; i++) {
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		scanf("%d", &tmp);
		if(tmp > 0) {
			r1 = i;
			break;
		}
	}
	if(r1) {
		for(int i = n, tmp; i >= 1; i--) {
			printf("? %d %d %d %d\n", i, 1, i, n);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp > 0) {
				r2 = i;
				break;
			}
		}
	}
	if(r1 && r2) {
		gao1(r1), gao2(r1);
		gao1(r2), gao2(r2);
	} else {
		int c1, c2, tmp;
		for(c1 = 1; ; c1++) {
			printf("? %d %d %d %d\n", 1, 1, n, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		for(c2 = n; ; c2--) {
			printf("? %d %d %d %d\n", 1, n, n, c2);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		int L = 1, R = n, Mid, tmp, r3 = inf;
		while(L <= R) {
			Mid = (L + R) >> 1;
			printf("? %d %d %d %d\n", 1, 1, Mid, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) r3 = min(r3, Mid), R = Mid - 1;
			else L = Mid + 1;
		}
		st.insert({r3, c1});
		st.insert({r3, c2});
	}
	output();
}


#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;

const int inf = 0x3f3f3f3f;

int n;
set<pair<int, int> > st;

void gao1(int r) {
	int L = 1, R = n, Mid, res, tmp = inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, 1, r, Mid);
		fflush(stdout);
		scanf("%d", &res);
		if(res & 1) {
			R = Mid - 1;
			if(res == 1) tmp = min(tmp, Mid);
		} else L = Mid + 1;
	}
	if(tmp != inf) st.insert({r, tmp});
}

void gao2(int r) {
	int L = 1, R = n, Mid, res, tmp = -inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, Mid, r, n);
		fflush(stdout);
		scanf("%d", &res);
		if(res & 1) {
			L = Mid + 1;
			if(res == 1) tmp = max(tmp, Mid);
		} else R = Mid - 1;
	}
	if(tmp != -inf) st.insert({r, tmp});
}

void output() {
	printf("!");
	for(set<pair<int, int> >::iterator it = st.begin(); it != st.end(); it++) {
		int x = (*it).first, y = (*it).second;
		printf(" %d %d", x, y);
	}
	puts("");
	fflush(stdout);
}

int main() {
	scanf("%d", &n);
	int r1 = 0, r2 = 0;
	for(int i = 1, tmp; i <= n; i++) {
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		scanf("%d", &tmp);
		if(tmp > 0) {
			r1 = i;
			break;
		}
	}
	if(r1) {
		for(int i = n, tmp; i >= 1; i--) {
			printf("? %d %d %d %d\n", i, 1, i, n);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp > 0) {
				r2 = i;
				break;
			}
		}
	}
	if(r1 && r2) {
		gao1(r1), gao2(r1);
		gao1(r2), gao2(r2);
	} else {
		int c1, c2, tmp;
		for(c1 = 1; ; c1++) {
			printf("? %d %d %d %d\n", 1, 1, n, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		for(c2 = n; ; c2--) {
			printf("? %d %d %d %d\n", 1, n, n, c2);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		int L = 1, R = n, Mid, r3 = inf;
		while(L <= R) {
			Mid = (L + R) >> 1;
			printf("? %d %d %d %d\n", 1, 1, Mid, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) r3 = min(r3, Mid), R = Mid - 1;
			else L = Mid + 1;
		}
		st.insert({r3, c1});
		st.insert({r3, c2});
	}
	output();
}


#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;

const int inf = 0x3f3f3f3f;

int n;
set<pair<int, int> > st;

void gao1(int r) {
	int L = 1, R = n, Mid, res, tmp = inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, 1, r, Mid);
		fflush(stdout);
		scanf("%d", &res);
		if(res >= 1) {
			R = Mid - 1;
			if(res == 1) tmp = min(tmp, Mid);
		} else L = Mid + 1;
	}
	if(tmp != inf) st.insert({r, tmp});
}

void gao2(int r) {
	int L = 1, R = n, Mid, res, tmp = -inf;
	while(L <= R) {
		Mid = (L + R) >> 1;
		printf("? %d %d %d %d\n", r, Mid, r, n);
		fflush(stdout);
		scanf("%d", &res);
		if(res >= 1) {
			L = Mid + 1;
			if(res == 1) tmp = max(tmp, Mid);
		} else R = Mid - 1;
	}
	if(tmp != -inf) st.insert({r, tmp});
}

void output() {
	printf("!");
	for(set<pair<int, int> >::iterator it = st.begin(); it != st.end(); it++) {
		int x = (*it).first, y = (*it).second;
		printf(" %d %d", x, y);
	}
	puts("");
	fflush(stdout);
}

int main() {
	scanf("%d", &n);
	int r1 = 0, r2 = 0;
	for(int i = 1, tmp; i <= n; i++) {
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		scanf("%d", &tmp);
		if(tmp > 0) {
			r1 = i;
			break;
		}
	}
	if(r1) {
		for(int i = n, tmp; i >= 1; i--) {
			printf("? %d %d %d %d\n", i, 1, i, n);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp > 0) {
				r2 = i;
				break;
			}
		}
	}
	if(r1 && r2) {
		gao1(r1), gao2(r1);
		gao1(r2), gao2(r2);
	} else {
		int c1, c2, tmp;
		for(c1 = 1; ; c1++) {
			printf("? %d %d %d %d\n", 1, 1, n, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		for(c2 = n; ; c2--) {
			printf("? %d %d %d %d\n", 1, n, n, c2);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) break;
		}
		int L = 1, R = n, Mid, r3 = inf;
		while(L <= R) {
			Mid = (L + R) >> 1;
			printf("? %d %d %d %d\n", 1, 1, Mid, c1);
			fflush(stdout);
			scanf("%d", &tmp);
			if(tmp) r3 = min(r3, Mid), R = Mid - 1;
			else L = Mid + 1;
		}
		st.insert({r3, c1});
		st.insert({r3, c2});
	}
	output();
}


#include <bits/stdc++.h>
#define DBG(x) cerr << #x << " = " << x << endl

using namespace std;
typedef long long LL;

const int inf = 0x3f3f3f3f;

int n;

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

int gao1(int r) {
	int L = 1, R = n, Mid, res;
	while(L <= R) {
		Mid = (L + R) >> 1;
		if(ask(r, 1, r, Mid) & 1) res = Mid, R = Mid - 1;
		else L = Mid + 1;
	}
	return res;
}

int gao2(int c) {
	int L = 1, R = n, Mid, res;
	while(L <= R) {
		Mid = (L + R) >> 1;
		if(ask(1, c, Mid, c) & 1) res = Mid, R = Mid - 1;
		else L = Mid + 1;
	}
	return res;
}

vector<pair<int, int> > v;
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		int tmp = ask(i, 1, i, n);
		if(tmp & 1) v.push_back({i, gao1(i)});
	}
	if(!v.size()) {
		for(int i = 1; i <= n; i++) {
			int tmp = ask(1, i, n, i);
			if(tmp & 1) {
				if(!v.size()) v.push_back({gao2(i), i});
				else v.push_back({v[0].first, i});
			}
		}
	}
	printf("! %d %d %d %d\n", v[0].first, v[0].second, v[1].first, v[1].second);
	fflush(stdout);
}


#include<bits/stdc++.h>
using namespace std;

int horizontal[1010], vertical[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		int ans;
		cin >> ans;
		horizontal[i]=ans;
		horizontal[i+1]=horizontal[i]-horizontal[i-1];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		vertical[i]=ans;
		vertical[i+1]=vertical[i]-vertical[i-1];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
	else{
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
}


#include<bits/stdc++.h>
using namespace std;

long long horizontal[1010], vertical[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		long long ans;
		cin >> ans;
		if(ans==-1) exit(0);
		horizontal[i]=ans;
		horizontal[i+1]=horizontal[i]-horizontal[i-1];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		vertical[i]=ans;
		vertical[i+1]=vertical[i]-vertical[i-1];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
	else if(impv.size()==2){
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
}


#include<bits/stdc++.h>
using namespace std;

int horizontal[1010], vertical[1010];
int mandh[1010], mandv[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		long long ans;
		cin >> ans;
		if(ans==-1) exit(0);
		horizontal[i]=ans;
		mandh[i]=ans-mandh[i-1];
		horizontal[i+1]=mandh[i];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		vertical[i]=ans;
		mandv[i]=ans-mandv[i-1];
		vertical[i+1]=mandv[i];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
	else if(impv.size()==2){
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
}


#include<bits/stdc++.h>
using namespace std;

int horizontal[1010], vertical[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		horizontal[i]=ans;
		horizontal[i+1]=horizontal[i]-horizontal[i-1];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		vertical[i]=ans;
		vertical[i+1]=vertical[i]-vertical[i-1];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
	else{
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
}


#include<bits/stdc++.h>
using namespace std;

long long horizontal[1010], vertical[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		long long ans;
		cin >> ans;
		if(ans==-1) exit(0);
		horizontal[i]=ans;
		horizontal[i+1]=horizontal[i]-horizontal[i-1];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		vertical[i]=ans;
		vertical[i+1]=vertical[i]-vertical[i-1];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
	else{
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
		fflush(stdout);
	}
}


#include<bits/stdc++.h>
using namespace std;

int horizontal[1010], vertical[1010];

int main(){
//	ios::sync_with_stdio(false);
  //	cin.tie(0);
  	int n;
  	cin >> n;
  	vector < int > imph, impv;
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", i, 1, i, n);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		horizontal[i]=ans;
		horizontal[i+1]=horizontal[i]-horizontal[i-1];
	}
	for(int i=1; i<=n-1; i++){
		printf("? %d %d %d %d\n", 1, i, n, i);
		fflush(stdout);
		int ans;
		cin >> ans;
		if(ans==-1) exit(0);
		vertical[i]=ans;
		vertical[i+1]=vertical[i]-vertical[i-1];
	}
	for(int i=1; i<=n; i++){
		if(vertical[i]&1) impv.push_back(i);
		if(horizontal[i]&1) imph.push_back(i);
	}
	if(imph.size()==2){
		int x1=imph[0], x2=imph[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x1, inicio, x1, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", x2, inicio, x2, mid);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int y2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
	else{
		int y1=impv[0], y2=impv[1];
		int inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y1, mid, y1);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x1=inicio;
		inicio=1, fim=n;
		while(inicio!=fim){
			int mid=(inicio+fim)/2;
			printf("? %d %d %d %d\n", inicio, y2, mid, y2);
			fflush(stdout);
			int ans;
			cin >> ans;
			if(ans==-1) exit(0);
			if(ans&1){
				fim=mid;
			}
			else inicio=mid+1;
		}
		int x2=inicio;
		printf("! %d %d %d %d\n", x1, y1, x2, y2);
	}
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define pb push_back
ll mod1=1000000007ll;
ll mod2=998244353ll;
ll k=0;

ll a[300001];
bool vis[300001];
vector < vector <ll> >  v(300001);
ll gcd(ll a, ll b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
ll power(ll x,ll y)
{   if(y==0) return 1;
    ll p=power(x,y/2);
    p=(p*p)%mod1;
    if(y%2) return  (p*x)%mod1;
    return p;
}

void solve()
{
   ll n,x1,x2,y1,y2,c=0;
   cin>>n;
   for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<s<<" "<<i<<" "<<mid<<" "<<i<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=s,y1=i;
           else
           x2=s,y2=i;
           c++;
       }
   }
   if(c<2)
   { c=0;
     for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
       cin>>a;
       if(a%2==1)
       {   if(c)
           {
               x2=i;
               y2=y1;
               break;
           }
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<i<<" "<<s<<" "<<i<<" "<<mid<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           x1=i,y1=s;
           c++;

       }
   }
   }
   cout<<"! "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
int main()
{
 ios::sync_with_stdio(0);
 cin.tie(0);
 cout.tie(0);

 int t=1;
 //cin>>t;
 while(t--)
    solve();
 return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define pb push_back
ll mod1=1000000007ll;
ll mod2=998244353ll;
ll k=0;

ll a[300001];
bool vis[300001];
vector < vector <ll> >  v(300001);
ll gcd(ll a, ll b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
ll power(ll x,ll y)
{   if(y==0) return 1;
    ll p=power(x,y/2);
    p=(p*p)%mod1;
    if(y%2) return  (p*x)%mod1;
    return p;
}

void solve()
{
   ll n,x1,x2,y1,y2,c=0;
   cin>>n;
   for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<s<<" "<<i<<" "<<mid<<" "<<i<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=s,y1=i;
           else if(x1!=i || y1!=s)
             x2=s,y2=i;
           else
            c--;
           c++;
       }
   }
   if(c<2)
   { c=0;
     for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
       cin>>a;
       if(a%2==1)
       {   if(c)
           {
               x2=i;
               y2=y1;
               break;
           }
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<i<<" "<<s<<" "<<i<<" "<<mid<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=i,y1=s;
           else if(x1!=i || y1!=s)
             x2=i,y2=s;
           else
            c--;
           c++;
       }
   }
   }
   cout<<"! "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
int main()
{
 ios::sync_with_stdio(0);
 cin.tie(0);
 cout.tie(0);

 int t=1;
 //cin>>t;
 while(t--)
    solve();
 return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define pb push_back
ll mod1=1000000007ll;
ll mod2=998244353ll;
ll k=0;

ll a[300001];
bool vis[300001];
vector < vector <ll> >  v(300001);
ll gcd(ll a, ll b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
ll power(ll x,ll y)
{   if(y==0) return 1;
    ll p=power(x,y/2);
    p=(p*p)%mod1;
    if(y%2) return  (p*x)%mod1;
    return p;
}

void solve()
{
   ll n,x1,x2,y1,y2,c=0;
   cin>>n;
   for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<s<<" "<<i<<" "<<mid<<" "<<i<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=i,y1=s;
           else if(x1!=i || y1!=s)
             x2=i,y2=s;
           else
            c--;
           c++;
       }
   }
   if(c<2)
   { c=0;
     for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<i<<" "<<s<<" "<<i<<" "<<mid<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=s,y1=i;
           else if(x1!=i || y1!=s)
             x2=s,y2=i;
           else
            c--;
           c++;
       }
   }
   }
   cout<<"! "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
int main()
{
 ios::sync_with_stdio(0);
 cin.tie(0);
 cout.tie(0);

 int t=1;
 //cin>>t;
 while(t--)
    solve();
 return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define pb push_back
ll mod1=1000000007ll;
ll mod2=998244353ll;
ll k=0;

ll a[300001];
bool vis[300001];
vector < vector <ll> >  v(300001);
ll gcd(ll a, ll b)
{
    if(b==0) return a;
    return gcd(b,a%b);
}
ll power(ll x,ll y)
{   if(y==0) return 1;
    ll p=power(x,y/2);
    p=(p*p)%mod1;
    if(y%2) return  (p*x)%mod1;
    return p;
}

void solve()
{
   ll n,x1,x2,y1,y2,c=0;
   cin>>n;
   for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<s<<" "<<i<<" "<<mid<<" "<<i<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=s,y1=i;
           else if(x1!=i || y1!=s)
             x2=s,y2=i;
           else
            c--;
           c++;
       }
   }
   if(c<2)
   { c=0;
     for(ll i =1;i<=n;i++)
   {   ll a;
       cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
       cin>>a;
       if(a%2==1)
       {
           ll s=1,l=n;
           while(s<l)
           {
             ll mid=(s+l)/2;
             cout<<"? "<<i<<" "<<s<<" "<<i<<" "<<mid<<endl;
             cin>>a;
             if(a%2==1)
                l=mid;
             else
                s=mid+1;
           }
           if(c==0)
           x1=i,y1=s;
           else if(x1!=i || y1!=s)
             x2=i,y2=s;
           else
            c--;
           c++;
       }
   }
   }
   cout<<"! "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
}
int main()
{
 ios::sync_with_stdio(0);
 cin.tie(0);
 cout.tie(0);

 int t=1;
 //cin>>t;
 while(t--)
    solve();
 return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    if(!llx) lx = ly = rx = ry = llx = lly = rrx = rry = 0;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
        if(i == n-1) {
            if(!lly) lly = rry = n, llx = 1, rrx = n;
            break;
        }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    if(!llx) {
    lx = ly = rx = ry = llx = lly = rrx = rry = 0;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
        if(i == n-1) {
            if(!lly) lly = rry = n, llx = 1, rrx = n;
            break;
        }
    }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    if(!llx) lx = ly = rx = ry = llx = lly = rrx = rry = 0;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    if(!llx) lx = ly = rx = ry = llx = lly = rrx = rry = 0;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << mx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << mx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry << endl;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry << endl;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << mx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << mx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

int n, t, lx, ly, rx, ry, llx, lly, rrx, rry;
int main() {
    cin >> n;
    for (int i= 1; i <= n; ++i) {
        cout << "? " << i << " " << 1 << " " << i << " " << n << endl;
        cin >> t;
        if(t%2) {
            if(!lx) lx = rx = i, ly = 1, ry = n;
            else llx = rrx = i, lly = 1, rry = n;
        }
    }
    for (int i= 1; i <= n; ++i) {
        cout << "? " << 1 << " " << i << " " << n << " " << i << endl;
        cin >> t;
        if(t%2) {
            if(!lx) ly = ry = i, lx = 1, rx = n;
            else lly = rry = i, llx = 1, rrx = n;
        }
    }
    if(lx == rx) {
        int my = ly+ry+1>>1;
        while(ly < ry) {
            cout << "? " << lx << " " << my << " " << rx << " " << ry;
            cin >> t;
            if(t%2) ly = my;
            else ry = my-1;
            my = ly+ry+1>>1;
        }
        ly = my;
        my = lly+rry+1>>1;
        while(lly < rry) {
            cout << "? " << llx << " " << my << " " << rrx << " " << rry;
            cin >> t;
            if(t%2) lly = my;
            else rry = my-1;
            my = lly+rry+1>>1;
        }
        lly = my;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    else {
        int mx = lx+rx+1>>1;
        while(lx < rx) {
            cout << "? " << mx << " " << ly << " " << mx << " " << ry << endl;
            cin >> t;
            if(t%2) lx = mx;
            else rx = mx-1;
            mx = lx+rx+1>>1;
        }
        lx = mx;
        mx = llx+rrx+1>>1;
        while(llx < rrx) {
            cout << "? " << mx << " " << lly << " " << mx << " " << rry << endl;
            cin >> t;
            if(t%2) llx = mx;
            else rrx = mx-1;
            mx = llx+rrx+1>>1;
        }
        llx = mx;
        cout << "! " << lx << " " << ly << " " << llx << " " << lly << endl;
    }
    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        int x;
        if (m == n - 1) {
            x = 0;
        } else {
            if (mode == 0) {
                cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
            } else {
                cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
            }
        }
        cin >> x;
        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {

        int x;
        if (i == n - 1) {
            x = 0;
        } else {
            cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
            cin >> x;
        }

        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
            break;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    last = 0;
    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {

            int x;
            if (i == n - 1) {
                x = 0;
            } else {
                cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
                cin >> x;
            }

            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
                break;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1;
    }

    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        int x;

        if (mode == 0) {
            cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
        } else {
            cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
        }
        cin >> x;

        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {

        int x;
        if (i == n - 1) {
            x = 0;
        } else {
            cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
            cin >> x;
        }

        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
            break;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    last = 0;
    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {

            int x;
            if (i == n - 1) {
                x = 0;
            } else {
                cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
                cin >> x;
            }

            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
                break;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1 << endl;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1 << endl;
    }

    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        if (mode == 0) {
            cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
        } else {
            cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
        }
        int x;
        cin >> x;
        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {
        cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
        int x;
        cin >> x;
        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {
            cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
            int x;
            cin >> x;
            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1;
    }

    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        if (mode == 0) {
            cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
        } else {
            cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
        }
        int x;
        cin >> x;
        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {
        cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
        int x;
        cin >> x;
        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
            break;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    last = 0;
    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {
            cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
            int x;
            cin >> x;
            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
                break;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1;
    }

    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        int x;
        if (m == n - 1) {
            x = 0;
        } else {
            if (mode == 0) {
                cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
            } else {
                cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
            }
            cin >> x;
        }

        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {

        int x;
        if (i == n - 1) {
            x = 0;
        } else {
            cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
            cin >> x;
        }

        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
            break;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    last = 0;
    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {

            int x;
            if (i == n - 1) {
                x = 0;
            } else {
                cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
                cin >> x;
            }

            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
                break;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1;
    }

    cout.flush();

    return 0;
}


#include <iostream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <stack>
#include <vector>

#define ll long long

using namespace std;

int n;

int binSearch(int mode, int x1) {
    int l = -1;
    int r = n;

    while (r - l > 1) {
        int m = (r + l) / 2;
        int x;
        if (m == n - 1) {
            x = 0;
        } else {
            if (mode == 0) {
                cout << "? " << x1 + 1 << " " << 1 << " " << x1 + 1 << " " << m + 1 << endl;
            } else {
                cout << "? " << 1 << " " << x1 + 1 << " " << m + 1 << " " << x1 + 1 << endl;
            }
        }
        cin >> x;
        if (x % 2 == 1) {
            r = m;
        } else {
            l = m;
        }
    }
    return r;
}

int main() {

    cin.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n;

    int last = 0;
    int start = -1;
    int finish = -1;
    int mode = 0;
    for (int i = 0; i < n; i ++) {

        int x;
        if (i == n - 1) {
            x = 0;
        } else {
            cout << "? " << 1 << " " << 1 << " " << i + 1 << " " << n << endl;
            cin >> x;
        }

        if (x % 2 == 1 && last == 0) {
            start = i;
//            cout << "start: " << i << "\n";
        }
        if (x % 2 == 0 && last == 1) {
            finish = i;
            break;
//            cout << "finish: " << i << "\n";
        }
        last = x % 2;
    }

    last = 0;
    if (start == -1) {
        mode = 1;
        for (int i = 0; i < n; i ++) {

            int x;
            if (i == n - 1) {
                x = 0;
            } else {
                cout << "? " <<  1 << " " << 1 << " " << n << " " << i + 1 << endl;
                cin >> x;
            }

            if (x % 2 == 1 && last == 0) {
                start = i;
//            cout << "start: " << i << "\n";
            }
            if (x % 2 == 0 && last == 1) {
                finish = i;
                break;
//            cout << "finish: " << i << "\n";
            }
            last = x % 2;
        }

    }

//    cout << mode << " " << start << " " << finish << endl;
    auto res1 = binSearch(mode, start);
    auto res2 = binSearch(mode, finish);

    if (mode == 0) {
        cout << "! " << start + 1 << " " << res1 + 1 << " " << finish + 1 << " " << res2 + 1;
    } else {
        cout << "! " << res1 + 1 << " " << start + 1 << " " << res2 + 1 << " " << finish + 1;
    }

    cout.flush();

    return 0;
}


#include <bits/stdc++.h>

using namespace std;

int n, x[2010], y[2010];

void print(int a, int b, int c, int d, char ch = '?') {
	printf("%c %d %d %d %d\n", ch, a, b, c, d);
	fflush(stdout);
}

int main() {
	int res;
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		print(i, 1, i, n);
		scanf("%d", &res);
		if (res & 1) x[++ x[0]] = i;
	}
	for (int i = 1; i <= n; i ++) {
		print(1, i, n, i);
		scanf("%d", &res);
		if (res & 1) y[++ y[0]] = i;
	}
	if (x[0] == 2 && y[0] == 2) {
		print(x[1], y[1], x[1], y[1]);
		scanf("%d", &res);
		if (res & 1) print(x[1], y[1], x[2], y[2], '!');
		else print(x[1], y[2], x[2], y[1], '!');
	}
	else if (x[0] == 2) {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, x[1], mid);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(x[0], p, x[1], p, '!');
	}
	else {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, mid, y[1]);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(p, y[1], p, y[2], '!');
	}
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int x[3], y[3];

void print(int a, int b, int c, int d, char ch = '?') {
	printf("%d %d %d %d %d\n", ch, a, b, c, d);
	fflush(stdout);
}

int main() {
	int res;
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		print(i, 1, i, n);
		scanf("%d", &res);
		if (res & 1) x[++ x[0]] = i;
	}
	for (int i = 1; i <= n; i ++) {
		print(1, i, n, i);
		scanf("%d", &res);
		if (res & 1) y[++ y[0]] = i;
	}
	if (x[0] == 2 && y[0] == 2) {
		print(x[1], y[1], x[1], y[1]);
		scanf("%d", &res);
		if (res & 1) print(x[1], y[1], x[2], y[2], '!');
		else print(x[1], y[2], x[2], y[1], '!');
	}
	else if (x[0] == 2) {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, x[1], mid);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(x[0], p, x[1], p);
	}
	else {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, mid, y[1]);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(p, y[1], p, y[2]);
	}
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int x[3], y[3];

void print(int a, int b, int c, int d, char ch = '?') {
	printf("%c %d %d %d %d\n", ch, a, b, c, d);
	fflush(stdout);
}

int main() {
	int res;
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		print(i, 1, i, n);
		scanf("%d", &res);
		if (res & 1) x[++ x[0]] = i;
	}
	for (int i = 1; i <= n; i ++) {
		print(1, i, n, i);
		scanf("%d", &res);
		if (res & 1) y[++ y[0]] = i;
	}
	if (x[0] == 2 && y[0] == 2) {
		print(x[1], y[1], x[1], y[1]);
		scanf("%d", &res);
		if (res & 1) print(x[1], y[1], x[2], y[2], '!');
		else print(x[1], y[2], x[2], y[1], '!');
	}
	else if (x[0] == 2) {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, x[1], mid);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(x[0], p, x[1], p, '!');
	}
	else {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, mid, y[1]);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(p, y[1], p, y[2], '!');
	}
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int n, x[3], y[3];

void print(int a, int b, int c, int d, char ch = '?') {
	printf("%c %d %d %d %d\n", ch, a, b, c, d);
	fflush(stdout);
}

int main() {
	int res;
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		print(i, 1, i, n);
		scanf("%d", &res);
		if (res & 1) x[++ x[0]] = i;
	}
	for (int i = 1; i <= n; i ++) {
		print(1, i, n, i);
		scanf("%d", &res);
		if (res & 1) y[++ y[0]] = i;
	}
	if (x[0] == 2 && y[0] == 2) {
		print(x[1], y[1], x[1], y[1]);
		scanf("%d", &res);
		if (res & 1) print(x[1], y[1], x[2], y[2], '!');
		else print(x[1], y[2], x[2], y[1], '!');
	}
	else if (x[0] == 2) {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, x[1], mid);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(x[0], p, x[1], p, '!');
	}
	else {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, mid, y[1]);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(p, y[1], p, y[2], '!');
	}
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

int n, x[3], y[3];

void print(int a, int b, int c, int d, char ch = '?') {
	printf("%c %d %d %d %d\n", ch, a, b, c, d);
	fflush(stdout);
}

int main() {
	int res;
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		print(i, 1, i, n);
		scanf("%d", &res);
		if (res & 1) x[++ x[0]] = i;
	}
	for (int i = 1; i <= n; i ++) {
		print(1, i, n, i);
		scanf("%d", &res);
		if (res & 1) y[++ y[0]] = i;
	}
	if (x[0] == 2 && y[0] == 2) {
		print(x[1], y[1], x[1], y[1]);
		scanf("%d", &res);
		if (res & 1) print(x[1], y[1], x[2], y[2], '!');
		else print(x[1], y[2], x[2], y[1], '!');
	}
	else if (x[0] == 2) {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, x[1], mid);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(x[1], p, x[2], p, '!');
	}
	else {
		int l = 1, r = n, mid, p;
		while (l <= r) {
			mid = l + r >> 1;
			print(1, 1, mid, y[1]);
			scanf("%d", &res);
			if (res & 1) p = mid, r = mid - 1;
			else l = mid + 1;
		}
		print(p, y[1], p, y[2], '!');
	}
	return 0;
}


#define mm(a) memset(a,0,sizeof(a));
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#include<bits/stdc++.h>
typedef long long ll;
#define PII pair<ll,ll>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(int)3e5 + 5;

int n,x,s;
vector<int>a,b,v;
vector<pair<int,int>>ans;
bool ck(int x,int mid,int op)
{
    if(op)cout<<"? "<<x<<" "<<mid<<" "<<x<<" "<<mid<<endl;
    else cout<<"? "<<mid<<"" <<x<<" "<<mid<<" "<<x<<endl;
    int now;
    cin>>now;
    return now&1;
}
void solve(int x,int op)//0->row 1->col
{
    int l=1,r=n,mid;
    while(l<r){
        mid=l+r>>1;
        if(ck(x,mid,op))r=mid;
        else l=mid+1;
    }
    if(op)ans.push_back(make_pair(x,l));
    else ans.push_back(make_pair(l,x));
}
int main()
{
    cin>>n;
    int temp=0;
    for(int i=1;i<n;i++){//row
        cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
        cin>>x;
        temp+=x&1;
        if(x&1)v.push_back(i);
    }
    if(temp==1)v.push_back(n);
    if(v.size()==2){
        solve(v[0],0);
        solve(v[1],0);
    }
    else {
        temp=0;
        for(int i=1;i<n;i++){//col
            cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
            cin>>x;
            temp+=x&1;
            if(x&1)v.push_back(i);
        }
        if(temp==1)v.push_back(n);
        solve(v[0],1);
        solve(v[1],1);
    }
    cout<<"! "<<ans[0].first<<" "<<ans[0].second<<" "<<ans[1].first<<" "<<ans[1].second<<endl;
    return 0;
}
/*

2
2
2 1
1 1

*/


#define mm(a) memset(a,0,sizeof(a));
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#include<bits/stdc++.h>
typedef long long ll;
#define PII pair<ll,ll>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(int)3e5 + 5;

int n,x,s;
vector<int>a,b,v;
vector<pair<int,int>>ans;
bool ck(int x,int mid,int op)
{
    if(op)cout<<"? "<<x<<" "<<1<<" "<<x<<" "<<mid<<endl;
    else cout<<"? "<<1<<" " <<x<<" "<<mid<<" "<<x<<endl;
    int now;
    cin>>now;
    return now&1;
}
void solve(int x,int op)//0->row 1->col
{
    int l=1,r=n,mid;
    while(l<r){
        mid=l+r>>1;
        if(ck(x,mid,op))r=mid;
        else l=mid+1;
    }
    if(op)ans.push_back(make_pair(x,l));
    else ans.push_back(make_pair(l,x));
}
int main()
{
    cin>>n;
    int temp=0;
    for(int i=1;i<n;i++){//row
        cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
        cin>>x;
        temp+=x&1;
        if(x&1)v.push_back(i);
    }
    if(temp==1)v.push_back(n);
    if(v.size()==2){
        solve(v[0],0);
        solve(v[1],0);
    }
    else {
        temp=0;
        for(int i=1;i<n;i++){//col
            cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
            cin>>x;
            temp+=x&1;
            if(x&1)v.push_back(i);
        }
        if(temp==1)v.push_back(n);
        solve(v[0],1);
        solve(v[1],1);
    }
    cout<<"! "<<n-ans[0].first+1<<" "<<n-ans[0].second+1<<" "<<n-ans[1].first+1<<" "<<n-ans[1].second+1<<endl;
    return 0;
}
/*

2
2
2 1
1 1

*/


#define mm(a) memset(a,0,sizeof(a));
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#include<bits/stdc++.h>
typedef long long ll;
#define PII pair<ll,ll>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(int)3e5 + 5;

int n,x,s;
vector<int>a,b,v;
vector<pair<int,int>>ans;
bool ck(int x,int mid,int op)
{
    if(op)cout<<"? "<<x<<" "<<mid<<" "<<x<<" "<<mid<<endl;
    else cout<<"? "<<mid<<" " <<x<<" "<<mid<<" "<<x<<endl;
    int now;
    cin>>now;
    return now&1;
}
void solve(int x,int op)//0->row 1->col
{
    int l=1,r=n,mid;
    while(l<r){
        mid=l+r>>1;
        if(ck(x,mid,op))r=mid;
        else l=mid+1;
    }
    if(op)ans.push_back(make_pair(x,l));
    else ans.push_back(make_pair(l,x));
}
int main()
{
    cin>>n;
    int temp=0;
    for(int i=1;i<n;i++){//row
        cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
        cin>>x;
        temp+=x&1;
        if(x&1)v.push_back(i);
    }
    if(temp==1)v.push_back(n);
    if(v.size()==2){
        solve(v[0],0);
        solve(v[1],0);
    }
    else {
        temp=0;
        for(int i=1;i<n;i++){//col
            cout<<"? "<<1<<" "<<i<<" "<<n<<" "<<i<<endl;
            cin>>x;
            temp+=x&1;
            if(x&1)v.push_back(i);
        }
        if(temp==1)v.push_back(n);
        solve(v[0],1);
        solve(v[1],1);
    }
    cout<<"! "<<ans[0].first<<" "<<ans[0].second<<" "<<ans[1].first<<" "<<ans[1].second<<endl;
    return 0;
}
/*

2
2
2 1
1 1

*/


#define mm(a) memset(a,0,sizeof(a));
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#include<bits/stdc++.h>
typedef long long ll;
#define PII pair<ll,ll>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(int)3e5 + 5;

int n,x,s;
vector<int>a,b,v;
vector<pair<int,int>>ans;
bool ck(int x,int mid,int op)
{
    if(op)cout<<"? "<<x<<" "<<mid<<" "<<x<<" "<<mid<<endl;
    else cout<<"? "<<mid<<"" <<x<<" "<<mid<<" "<<x<<endl;
    int now;
    cin>>now;
    return now&1;
}
void solve(int x,int op)//0->row 1->col
{
    int l=1,r=n,mid;
    while(l<r){
        mid=l+r>>1;
        if(ck(x,mid,op))r=mid;
        else l=mid+1;
    }
    if(op)ans.push_back(make_pair(x,l));
    else ans.push_back(make_pair(l,x));
}
int main()
{
    cin>>n;
    int temp=0;
    for(int i=1;i<n;i++){//row
        cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
        cin>>x;
        temp+=x;
        if(x)v.push_back(i);
    }
    if(temp==1)v.push_back(n);
    if(v.size()==2){
        solve(v[0],0);
        solve(v[1],0);
    }
    else {
        temp=0;
        for(int i=1;i<n;i++){//col
            cout<<"? "<<1<<" "<<i<<" "<<1<<" "<<n<<endl;
            cin>>x;
            temp+=x;
            if(x)v.push_back(i);
        }
        if(temp==1)v.push_back(n);
        solve(v[0],1);
        solve(v[1],1);
    }
    cout<<"! "<<ans[0].first<<" "<<ans[0].second<<" "<<ans[1].first<<" "<<ans[1].second<<endl;
    return 0;
}


#define mm(a) memset(a,0,sizeof(a));
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#include<bits/stdc++.h>
typedef long long ll;
#define PII pair<ll,ll>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(int)3e5 + 5;

int n,x,s;
vector<int>a,b,v;
vector<pair<int,int>>ans;
bool ck(int x,int mid,int op)
{
    if(op)cout<<"? "<<x<<" "<<mid<<" "<<x<<" "<<mid<<endl;
    else cout<<"? "<<mid<<"" <<x<<" "<<mid<<" "<<x<<endl;
    int now;
    cin>>now;
    return now&1;
}
void solve(int x,int op)//0->row 1->col
{
    int l=1,r=n,mid;
    while(l<r){
        mid=l+r>>1;
        if(ck(x,mid,op))r=mid;
        else l=mid+1;
    }
    if(op)ans.push_back(make_pair(x,l));
    else ans.push_back(make_pair(l,x));
}
int main()
{
    cin>>n;
    int temp=0;
    for(int i=1;i<n;i++){//row
        cout<<"? "<<i<<" "<<1<<" "<<i<<" "<<n<<endl;
        cin>>x;
        temp+=x;
        if(x)v.push_back(i);
    }
    if(temp==1)v.push_back(n);
    if(v.size()==2){
        solve(v[0],0);
        solve(v[1],1);
    }
    else {
        temp=0;
        for(int i=1;i<n;i++){//col
            cout<<"? "<<1<<" "<<i<<" "<<1<<" "<<n<<endl;
            cin>>x;
            temp+=x;
            if(x)v.push_back(i);
        }
        if(temp==1)v.push_back(n);
        solve(v[0],0);
        solve(v[1],1);
    }
    cout<<"! "<<ans[0].first<<" "<<ans[0].second<<" "<<ans[1].first<<" "<<ans[1].second<<endl;
    return 0;
}