func_code_string: #include <bits/stdc++.h>   using namespace std;   inline char gc() { return getchar(); }   template <class T>   int read(T &ans) {     ans = 0;     char ch = gc();     T f = 1;     while (!isdigit(ch)) {       if (ch == EOF) return -1;       if (ch ==  - ) f = -1;       ch = gc();     }     while (isdigit(ch)) ans = ans * 10 + ch -  0 , ch = gc();     ans *= f;     return 1;   }   template <class T1, class T2>   int read(T1 &a, T2 &b) {     return read(a) != EOF && read(b) != EOF ? 2 : EOF;   }   template <class T1, class T2, class T3>   int read(T1 &a, T2 &b, T3 &c) {     return read(a, b) != EOF && read(c) != EOF ? 3 : EOF;   }   const int Maxn = 1100;   const int inf = 0x3f3f3f3f;   int a[Maxn], b[Maxn], c[Maxn], tims;   long long n, L, v;   pair<long long, long long> ans[Maxn];   long long query(long long a, long long b) {     printf( ? %I64d %I64d n , a, b);     fflush(stdout);     long long ans;     read(ans);     return ans;   }   long long find(int x, long long k, long long l, long long r) {     long long mid = l + r >> 1;     while (1) {       long long y = query(x, mid);       if (y == k) return mid;       if (y < k)         l = mid + 1;       else         r = mid - 1;       mid = l + r >> 1;     }   }   void kth(int l, int r, int k, long long ql, long long qr) {     if (l == r) return;     int x = rand() % (r - l + 1) + l;     long long y = find(a[x], (L / n) * k, ql, qr);     int mid = k - l + 1;     int l1 = l - 1, l2 = r + 1, l3 = 0;     c[++l3] = a[x];     for (int i = l; i <= r; i++) {       if (i == x) continue;       long long sxz = query(a[i], y);       if (sxz < (L / n) * k) b[--l2] = a[i];       if (sxz == (L / n) * k) c[++l3] = a[i];       if (sxz > (L / n) * k) b[++l1] = a[i];     }     while (l1 < k && l3) b[++l1] = c[l3--];     if (l1 == k) {       v = y;       while (l3) b[--l2] = c[l3--];       for (int i = l; i <= r; i++) a[i] = b[i];       return;     }     if (l1 < k) {       for (int i = l; i <= r; i++) a[i] = b[i];       kth(l1 + 1, r, k, ql, qr);       return;     }     while (l3) b[--l2] = c[l3--];     for (int i = l; i <= r; i++) a[i] = b[i];     kth(l, l1, k, ql, qr);   }   void solve(int l, int r, long long ql, long long qr) {     if (l == r) {       ans[a[l]] = make_pair(ql, qr);       return;     }     int mid = l + r >> 1;     kth(l, r, mid, ql, qr);     long long x = v;     solve(l, mid, ql, x);     solve(mid + 1, r, x, qr);   }   signed main() {     read(n, L);     for (int i = 1; i <= n; i++) a[i] = i;     solve(1, n, 0, 1000000000000000000ll);     puts( ! );     for (int i = 1; i <= n; i++)       printf( %I64d %I64d n , ans[i].first, ans[i].second);     fflush(stdout);     return 0;   }   