#include <bits/stdc++.h>
using namespace std;
long long read(long long x = 0) {
  int c, f = 1;
  for (c = getchar(); !isdigit(c); c = getchar())
    if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  return f * x;
}
long long q(long long x1, long long y1, long long x2, long long y2) {
  long long x;
  printf("? %lld %lld %lld %lld\n", x1, y1, x2, y2);
  fflush(stdout);
  cin >> x;
  return x;
}
long long mark[200010], ansr[200010], ansc[200010];
int main() {
  vector<long long> row, column, ans;
  long long i, N, x;
  cin >> N;
  for (i = 1; i <= N; i++) {
    ansr[i] = q(i, 1, i, N);
    ansc[i] = q(1, i, N, i);
  }
  for (i = 1; i <= N; i++) {
    if (ansr[i] & 1) row.push_back(i);
    if (ansc[i] & 1) column.push_back(i);
  }
  if (!row.empty() and !column.empty()) {
    for (auto r : row)
      for (auto c : column) {
        x = q(r, c, r, c);
        if (x & 1) ans.push_back(r), ans.push_back(c);
      }
  } else {
    if (row.empty()) {
      long long l, r, mid, x;
      l = 1, r = N, mid = l + r >> 1;
      while (l < r) {
        x = q(1, column[0], mid, column[0]);
        if (x & 1)
          r = mid;
        else
          l = mid + 1;
        mid = l + r >> 1;
      }
      ans.push_back(r), ans.push_back(column[0]);
      ans.push_back(r), ans.push_back(column[1]);
    } else {
      long long l, r, mid, x;
      l = 1, r = N, mid = l + r >> 1;
      while (l < r) {
        x = q(row[0], 1, row[0], mid);
        if (x & 1)
          r = mid;
        else
          l = mid + 1;
        mid = l + r >> 1;
      }
      ans.push_back(row[0]), ans.push_back(r);
      ans.push_back(row[1]), ans.push_back(r);
    }
  }
  printf("! %lld %lld %lld %lld", ans[0], ans[1], ans[2], ans[3]);
  fflush(stdout);
  return 0;
}
