#include <bits/stdc++.h>
std::mt19937_64 rng(
    std::chrono::steady_clock::now().time_since_epoch().count());
long long int myRand(long long int R) {
  long long int val = rng() % R;
  assert(val >= 0);
  return val;
}
using namespace std;
const long double PI = atan(1.0) * 4;
const int64_t INF = 3e18;
const int32_t LOG = 21;
const long long int MOD = 1e9 + 7;
long long int zeros[100005];
long long int ans[100005];
long long int ask(long long int i, long long int j) {
  i++;
  j++;
  assert(i != j);
  cout << "? " << i << " " << j << '\n';
  long long int resp;
  cin >> resp;
  return resp;
}
long long int query(long long int ind, long long int n) {
  long long int ans = (1 << 12) - 1;
  for (long long int i = 0; i < 12; i++) {
    if (zeros[i] == ind) {
      if (ans & (1 << i)) ans ^= (1 << i);
      continue;
    }
    if (ans == -1)
      ans = ask(ind, zeros[i]);
    else
      ans &= ask(ind, zeros[i]);
  }
  return ans;
}
int32_t main() {
  long long int tests = 1;
  for (long long int ii = 0; ii < tests; ii++) {
    long long int n;
    cin >> n;
    fill(zeros, zeros + 13, -1);
    long long int marked = 0;
    while (marked != 12) {
      long long int x = myRand(n), y = myRand(n);
      while (x == y) {
        x = myRand(n);
        y = myRand(n);
      }
      long long int resp = ask(x, y);
      for (long long int i = 0; i < 12; i++) {
        if (!((1 << i) & resp)) {
          if (zeros[i] == -1) {
            zeros[i] = x;
            marked++;
          }
        }
      }
    }
    long long int ind = 0;
    long long int val = query(ind, n);
    for (long long int i = 1; i < n; i++) {
      if (val == 0) break;
      long long int resp = ask(ind, i);
      if (resp == val) {
        ind = i;
        val = query(ind, n);
      }
    }
    ans[ind] = 0;
    for (long long int i = 0; i < n; i++) {
      if (i != ind) {
        ans[i] = ask(i, ind);
      }
    }
    cout << "!";
    for (long long int i = 0; i < n; i++) cout << " " << ans[i];
    cout << '\n';
  }
  return 0;
}
