#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1010;
map<pair<int, long long>, long long> poz;
long long ans[2][NMAX];
mt19937 rnd(time(0));
long long L;
long long ask(int id, long long p) {
  if (poz.find({id, p}) != poz.end()) return poz[{id, p}];
  cout << "? " << id << ' ' << p << endl;
  cin >> poz[{id, p}];
  return poz[{id, p}];
}
long long interval(int x, long long a, long long b) {
  return ask(x, b) - ask(x, a);
}
long long find(int id, long long st, long long dr, long long S) {
  long long ans = st;
  for (long long i = (1LL << 60); i; i /= 2)
    if (ans + i <= dr && interval(id, st, ans + i) <= S) ans += i;
  assert(interval(id, st, ans) == S);
  return ans;
}
void kthelement(vector<int>& v, long long st, long long dr, long long S,
                int from, int to, int k) {
  if (from == to) return;
  shuffle(v.begin() + from, v.begin() + to + 1, rnd);
  int id = v[from];
  long long loc = find(id, st, dr, S);
  int last = from;
  for (int i = from + 1; i <= to; i++) {
    if (make_pair(interval(v[i], st, loc), i) > make_pair(S, id)) {
      swap(v[last], v[last + 1]);
      if (last != i - 1) swap(v[last], v[i]);
      last++;
    }
  }
  assert(v[last] == id);
  if (k < last)
    kthelement(v, st, dr, S, from, last - 1, k);
  else if (k > last)
    kthelement(v, st, dr, S, last + 1, to, k);
}
void solve(vector<int> v, long long st, long long dr) {
  while (st >= dr)
    ;
  int n = v.size();
  int m = n / 2;
  if (n == 1) {
    ans[0][v[0]] = st, ans[1][v[0]] = dr;
    return;
  }
  long long S = m * L;
  kthelement(v, st, dr, S, 0, v.size() - 1, m - 1);
  vector<int> left, right;
  for (int i = 0; i < v.size(); i++) {
    if (i < m)
      left.push_back(v[i]);
    else
      right.push_back(v[i]);
  }
  long long mij = find(left.back(), st, dr, S);
  assert(interval(left.back(), st, mij) == S);
  solve(left, st, mij);
  solve(right, mij, dr);
}
int main() {
  int n;
  cin >> n >> L;
  L /= n;
  vector<int> v(n);
  iota(v.begin(), v.end(), 1);
  long long MAX = 1000 * 1000 * 1000;
  MAX = MAX * MAX;
  solve(v, 0, MAX);
  cout << "!\n";
  for (int i = 1; i <= n; i++) cout << ans[0][i] << ' ' << ans[1][i] << '\n';
  cout.flush();
  return 0;
}
