func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   void maxtt(T& t1, T t2) {     t1 = max(t1, t2);   }   template <typename T>   void mintt(T& t1, T t2) {     t1 = min(t1, t2);   }   bool debug = 0;   int n, m, k;   int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};   string direc =  URDL ;   const long long MOD2 = (long long)998244353 * (long long)998244353;   long long ln, lk, lm;   void etp(bool f = 0) {     puts(f ?  YES  :  NO );     exit(0);   }   void addmod(int& x, int y, int mod = 998244353) {     assert(y >= 0);     x += y;     if (x >= mod) x -= mod;     assert(x >= 0 && x < mod);   }   void et(int x = -1) {     printf( %d n , x);     exit(0);   }   long long fastPow(long long x, long long y, int mod = 998244353) {     long long ans = 1;     while (y > 0) {       if (y & 1) ans = (x * ans) % mod;       x = x * x % mod;       y >>= 1;     }     return ans;   }   long long gcd1(long long x, long long y) { return y ? gcd1(y, x % y) : x; }   long long rL;   int a[1035], b[1035];   long long ansl[1035], ansr[1035];   long long rd(int id, long long x) {     printf( ? %d %lld n , id, x);     fflush(stdout);     scanf( %lld , &lk);     return lk;   }   void cal(int l, int r, long long L, long long R) {     if (l == r) {       ansl[a[l]] = L;       ansr[a[l]] = R;       return;     }     int m1 = (l + r) / 2;     long long X = rL / n * m1, m2;     mt19937 ttrand((int)time(0));     for (int p = l, q = r;;) {       int i = uniform_int_distribution<int>(p, q)(ttrand);       long long lb = L, rb = R;       while (lb < rb) {         long long mb = (lb + rb) / 2;         if (rd(a[i], mb) < X)           lb = mb + 1;         else           rb = mb;       }       int l2 = p, r2 = q;       vector<int> e;       for (int j = p; j <= q; ++j) {         long long y = rd(a[j], lb);         if (y > X)           b[l2++] = a[j];         else if (y < X)           b[r2--] = a[j];         else           e.push_back(a[j]);       }       for (int(j) = 0; (j) < (int)(e.size()); (j)++) b[l2 + j] = e[j];       for (int z = p; z <= q; z++) a[z] = b[z];       if (l2 <= m1 && m1 <= r2) {         m2 = lb;         break;       }       if (l2 < m1)         p = l2 + 1;       else         q = l2 - 1;     }     cal(l, m1, L, m2);     cal(m1 + 1, r, m2, R);   }   void fmain(int tid) {     scanf( %d%lld , &n, &rL);     for (int(i) = 1; (i) <= (int)(n); (i)++) a[i] = i;     cal(1, n, 0, 1e18);     puts( ! );     for (int(i) = 1; (i) <= (int)(n); (i)++)       printf( %lld %lld n , ansl[i], ansr[i]);   }   int main() {     int t = 1;     for (int(i) = 1; (i) <= (int)(t); (i)++) {       fmain(i);     }     return 0;   }   