#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1073741824")
using namespace std;
int query(int x1, int y1, int x2, int y2) {
#pragma warning(disable : 4996)
  cout << "? " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
  int ans;
  scanf("%d", &ans);
  return ans;
}
int x1[2], yy1[2], x2[2], y2[2];
int c = 0;
void find(int xl, int yl, int xr, int yr) {
  if (xl > xr || yl > yr || query(xl, yl, xr, yr) == 0) return;
  int l = xl - 1, r = xr;
  while (r - l > 1) {
    int p = (r + l) / 2, ret = query(xl, yl, p, yr);
    if (ret != 0)
      r = p;
    else
      l = p;
  }
  x2[c] = r;
  l = xl, r = x2[c] + 1;
  while (r - l > 1) {
    int p = (l + r) / 2, ret = query(p, yl, x2[c], yr);
    if (ret == 0)
      r = p;
    else
      l = p;
  }
  x1[c] = l;
  l = yl - 1, r = yr;
  while (r - l > 1) {
    int p = (l + r) / 2, ret = query(x1[c], yl, x2[c], p);
    if (ret == 0)
      l = p;
    else
      r = p;
  }
  y2[c] = r;
  l = yl, r = y2[c] + 1;
  while (r - l > 1) {
    int p = (l + r) / 2, ret = query(x1[c], p, x2[c], y2[c]);
    if (ret == 0)
      r = p;
    else
      l = p;
  }
  yy1[c] = l;
  c++;
}
int main() {
#pragma warning(disable : 4996)
  int n;
  scanf("%d", &n);
  find(1, 1, n, n);
  find(1, 1, x1[0] - 1, n);
  if (c < 2) find(x2[0] + 1, 1, n, n);
  if (c < 2) find(1, y2[0] + 1, n, n);
  if (c < 2) find(1, 1, n, yy1[0] - 1);
  cout << "! " << x1[0] << " " << yy1[0] << " " << x2[0] << " " << y2[0] << " ";
  cout << x1[1] << " " << yy1[1] << " " << x2[1] << " " << y2[1] << endl;
  return 0;
}
