func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   int query(int x1, int y1, int x2, int y2) {     if (x1 > x2 || y1 > y2) return 0;     printf( ? %d %d %d %d n , x1, y1, x2, y2);     fflush(stdout);     int ans;     scanf( %d , &ans);     return ans;   }   int get_right(int x1, int y1, int x2, int y2) {     int left = x1 - 1, right = x2;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(x1, y1, mid, y2) == 1)         right = mid;       else         left = mid;     }     return right;   }   int get_left(int x1, int y1, int x2, int y2) {     int left = x1, right = x2 + 1;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(mid, y1, x2, y2) == 1)         left = mid;       else         right = mid;     }     return left;   }   int get_up(int x1, int y1, int x2, int y2) {     int left = y1 - 1, right = y2;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(x1, y1, x2, mid) == 1)         right = mid;       else         left = mid;     }     return right;   }   int get_down(int x1, int y1, int x2, int y2) {     int left = y1, right = y2 + 1;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(x1, mid, x2, y2) == 1)         left = mid;       else         right = mid;     }     return left;   }   bool solve_x() {     int left = 0, right = n;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(1, 1, mid, n) > 0)         right = mid;       else         left = mid;     }     if (query(right + 1, 1, n, n) != 1) return false;     int L1 = get_left(1, 1, right, n);     int R1 = get_right(1, 1, right, n);     int D1 = get_down(1, 1, right, n);     int U1 = get_up(1, 1, right, n);     int L2 = get_left(right + 1, 1, n, n);     int R2 = get_right(right + 1, 1, n, n);     int D2 = get_down(right + 1, 1, n, n);     int U2 = get_up(right + 1, 1, n, n);     printf( ! %d %d %d %d %d %d %d %d n , L1, D1, R1, U1, L2, D2, R2, U2);     fflush(stdout);     return true;   }   bool solve_y() {     int left = 0, right = n;     while (right - left > 1) {       int mid = (left + right) / 2;       if (query(1, 1, n, mid) > 0)         right = mid;       else         left = mid;     }     if (query(1, right + 1, n, n) != 1) return false;     int L1 = get_left(1, 1, n, right);     int R1 = get_right(1, 1, n, right);     int D1 = get_down(1, 1, n, right);     int U1 = get_up(1, 1, n, right);     int L2 = get_left(1, right + 1, n, n);     int R2 = get_right(1, right + 1, n, n);     int D2 = get_down(1, right + 1, n, n);     int U2 = get_up(1, right + 1, n, n);     printf( ! %d %d %d %d %d %d %d %d n , L1, D1, R1, U1, L2, D2, R2, U2);     fflush(stdout);     return true;   }   void solve() {     scanf( %d , &n);     if (!solve_x())       if (!solve_y()) throw;   }   int main() {     solve();     0;   }   