#include <bits/stdc++.h>
using namespace std;
int fx[] = {-1, 1, 0, 0};
int fy[] = {0, 0, 1, -1};
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1};
int dy[] = {0, 0, 1, -1, 1, -1, -1, 1};
int cx[] = {1, 1, 2, 2, -1, -1, -2, -2};
int cy[] = {2, -2, 1, -1, 2, -2, 1, -1};
const int N = 1 << 11;
int n;
int ans[N + 1];
int ask(int p, int q) {
  printf("? %d %d\n", p, q);
  fflush(stdout);
  int x;
  scanf("%d", &x);
  return x;
}
int value(int x) {
  int ans = N - 1;
  for (int i = 1; i <= 15; i++) {
    int a = rand() % n + 1;
    if (a == x) continue;
    ans &= ask(x, a);
  }
  return ans;
}
void solve() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  srand(2137);
  scanf("%d", &n);
  vector<int> v;
  for (int i = 1; i <= n; i++) v.push_back(i);
  random_shuffle(v.begin(), v.end());
  pair<int, int> zero = {v[0], value(v[0])};
  for (int i = 1; i <= n - 1; i++) {
    int a = ask(zero.first, v[i]);
    if ((a & zero.second) == a) zero = {v[i], value(v[i])};
  }
  for (int i = 1; i <= n; i++)
    if (i != zero.first) ans[i] = ask(i, zero.first);
  printf("! ");
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
}
signed main() {
  solve();
  return 0;
}
