#include <bits/stdc++.h>
using namespace std;
int n, a1, a2, b1, b2, g;
vector<int> t1, t2;
inline int query(int a, int b, int c, int d) {
  cout << "? " << a << ' ' << b << ' ' << c << ' ' << d << '\n';
  cout.flush();
  scanf("%d", &g);
  return g;
}
inline bool jud(int a, int b) { return query(a, b, a, b) & 1; }
int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    if (query(1, i, n, i) & 1) t1.push_back(i);
    if (query(i, 1, i, n) & 1) t2.push_back(i);
  }
  if (t1.size() && t2.size()) {
    if (jud(t2[0], t1[0]))
      cout << "! " << t2[0] << ' ' << t1[0] << ' ' << t2[1] << ' ' << t1[1]
           << '\n';
    else
      cout << "! " << t2[0] << ' ' << t1[1] << ' ' << t2[1] << ' ' << t1[0]
           << '\n';
    cout.flush();
  } else if (!t1.size()) {
    int l = 1, r = n, res = 0;
    int mx = max(t2[0], t2[1]) - 1;
    while (l <= r) {
      int mid = l + r >> 1;
      if (query(1, 1, mx, mid) & 1)
        res = mid, r = mid - 1;
      else
        l = mid + 1;
    }
    cout << "! " << t2[0] << ' ' << res << ' ' << t2[1] << ' ' << res << '\n';
    cout.flush();
  } else {
    int l = 1, r = n, res = 0;
    int mx = max(t1[0], t1[1]) - 1;
    while (l <= r) {
      int mid = l + r >> 1;
      if (query(1, 1, mid, mx) & 1)
        res = mid, r = mid - 1;
      else
        l = mid + 1;
    }
    cout << "! " << res << ' ' << t1[0] << ' ' << res << ' ' << t1[1] << '\n';
    cout.flush();
  }
  return 0;
}
