#include <bits/stdc++.h>
using namespace std;
long long int const mod = 998244353;
std::mt19937 rng(
    (int)std::chrono::steady_clock::now().time_since_epoch().count());
int rand_rng(int l, int r) {
  uniform_int_distribution<int> p(l, r);
  return p(rng);
}
int arr1[10000009];
int parent[10000009];
vector<long long int> sieve;
void sievefun(long long int n) {
  for (long long int i = 2; i <= n; i++) {
    if (arr1[i] == 0) {
      parent[i] = i;
      for (long long int j = i * i; j <= n; j += i) {
        if (arr1[j] == 0) parent[j] = i;
        arr1[j] = 1;
      }
    }
  }
}
long long int power(long long int x, long long int y, long long int m) {
  long long int temp;
  if (y == 0 || x == 1) return 1;
  temp = power(x, y / 2, m) % m;
  if (y % 2 == 0)
    return ((temp) * (temp)) % m;
  else
    return (((x) % m) * ((temp * temp) % m)) % m;
}
int const N = 2000009;
int main() {
  int T;
  T = 1;
  while (T--) {
    long long int n;
    cin >> n;
    long long int tmp = 1;
    long long int num = 0;
    while (tmp <= n - 1) {
      tmp *= 2;
      num++;
    }
    int ans[n + 3];
    for (int i = 0; i < (int)n + 1; i++) ans[i] = 0;
    set<long long int> st;
    int mp[num + 3];
    set<pair<long long int, long long int> > q;
    long long int x, y;
    while (st.size() < num) {
      int l = rand_rng(1, n);
      int r = l;
      while (r == l) {
        r = rand_rng(1, n);
      }
      if (q.find({l, r}) != q.end()) continue;
      cout << "? " << l << " " << r;
      q.insert({l, r});
      q.insert({r, l});
      cout << endl;
      cin >> x;
      for (int i = 0; i < (int)num; i++) {
        if (((x >> i) & 1) == 0) {
          st.insert(i);
          mp[i] = l;
        }
      }
    }
    int ind = 1;
    long long int temp = -1;
    for (int j = 0; j < (int)num; j++) {
      if (ind == mp[j]) continue;
      cout << "? " << ind << " " << mp[j] << endl;
      cin >> y;
      if (temp == -1) {
        temp = y;
      } else {
        temp &= y;
      }
    }
    for (int i = 2; i <= n; i++) {
      cout << "? " << ind << " " << i << endl;
      cin >> x;
      if (x == temp) {
        temp = 0;
        for (int j = 0; j < (int)num; j++) {
          if (i == mp[j]) continue;
          cout << "? " << i << " " << mp[j] << endl;
          cin >> y;
          if ((y >> j) & 1) {
            temp |= (1 << j);
          }
        }
        ind = i;
      }
    }
    for (int i = 1; i <= n; i++) {
      if (ind != i) {
        cout << "? " << ind << " " << i << endl;
        cin >> ans[i];
      }
    }
    cout << "! ";
    for (int i = 0; i < (int)n; i++) cout << ans[i + 1] << " ";
    cout << endl;
  }
}
