#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& v) {
  os << "(" << v.first << " " << v.second << ")";
  return os;
}
template <typename T, typename U = typename T::value_type,
          typename = typename enable_if<!is_same<T, string>::value>::type>
ostream& operator<<(ostream& os, const T& v) {
  os << '[';
  for (const auto& it : v) os << it << " ";
  if (!v.empty()) os << "\b";
  os << "]";
  return os;
}
int N;
int query(int x1, int y1, int x2, int y2) {
  printf("? %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  int cnt;
  scanf("%d", &cnt);
  return cnt;
}
int find_x(int x1, int y1, int x2, int y2) {
  int x_min = x1 - 1, x_max = x2;
  while (x_max - x_min > 1) {
    int x0 = (x_min + x_max) / 2;
    if (query(x1, y1, x0, y2) % 2 == 0)
      x_min = x0;
    else
      x_max = x0;
  }
  return x_max;
}
int find_y(int x1, int y1, int x2, int y2) {
  int y_min = y1 - 1, y_max = y2;
  while (y_max - y_min > 1) {
    int y0 = (y_min + y_max) / 2;
    if (query(x1, y1, x2, y0) % 2 == 0)
      y_min = y0;
    else
      y_max = y0;
  }
  return y_max;
}
int main() {
  cin >> N;
  int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
  for (int i = 0; i < (N - 1); i++) {
    if (query(1, 1, N, i + 1) % 2 == 1) {
      y1 = i + 1;
      break;
    }
  }
  if (y1 == -1) {
    for (int i = 0; i < (N - 1); i++) {
      if (query(1, 1, i + 1, N) % 2 == 1) {
        x1 = i + 1;
        break;
      }
    }
    y1 = y2 = find_y(1, 1, x1, N);
    x2 = find_x(x1 + 1, 1, N, N);
  } else {
    y2 = find_y(1, y1 + 1, N, N);
    x1 = find_x(1, 1, N, y1);
    x2 = find_x(1, y1 + 1, N, N);
  }
  printf("! %d %d %d %d\n", x1, y1, x2, y2);
  fflush(stdout);
  return 0;
}
