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