#include <bits/stdc++.h>
using namespace std;
int p[5005], cnt[5005], qwq[5005];
vector<int> v;
int main(int argc, char** argv) {
  int n;
  srand((unsigned long long)new char);
  cin >> n;
  for (int i = 1; i <= n; i++) p[i] = i - 1;
  for (int i = 1; i <= n; i++) cnt[i] = cnt[i ^ i & -i] + 1;
  random_shuffle(p + 1, p + n + 1);
  int x = 0, now = 0;
  while (1) {
    int a, b;
    do a = rand() % n, b = rand() % n;
    while (a == b);
    cout << "? " << a + 1 << " " << b + 1 << endl;
    int t;
    cin >> t;
    if (cnt[t] <= 6) {
      x = a + 1;
      break;
    }
  }
  now = 2047;
  for (int i = 1; i <= n; i++) {
    if (x != i) {
      cout << "? " << x << " " << i << endl;
      cin >> qwq[i];
      now &= qwq[i];
    }
  }
  qwq[x] = now;
  for (int i = 1; i <= n; i++)
    if (qwq[i] == now) v.push_back(i);
  int pos = 0;
  if (v.size() == 1)
    pos = x;
  else if (v.size() == 2) {
    if (v[0] != x)
      pos = v[0];
    else
      pos = v[1];
  } else {
    while (1) {
      int a;
      do a = v[rand() % v.size()];
      while (a == x);
      for (auto t : v) {
        if (a != t) {
          cout << "? " << a << " " << t << endl;
          cin >> qwq[t];
          now &= qwq[t];
        }
      }
      qwq[a] = now;
      v.clear();
      for (int i = 1; i <= n; i++)
        if (qwq[i] == now) v.push_back(i);
      if (v.size() == 2) {
        if (v[0] != a)
          pos = v[0];
        else
          pos = v[1];
        break;
      } else if (v.size() == 1) {
        pos = a, qwq[a] = 0;
        break;
      }
      x = a;
    }
  }
  qwq[pos] = 0;
  for (int i = 1; i <= n; i++) {
    if (i != pos) {
      cout << "? " << i << " " << pos << endl;
      cin >> qwq[i];
    }
  }
  cout << "! ";
  for (int i = 1; i <= n; i++) cout << qwq[i] << " ";
  return 0;
}
