#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  x *= f;
}
template <class T>
T gcd(T a, T b) {
  return !b ? a : gcd(b, a % b);
}
template <class T>
inline void umin(T &x, T y) {
  x = x < y ? x : y;
}
template <class T>
inline void umax(T &x, T y) {
  x = x > y ? x : y;
}
mt19937 R(chrono::system_clock().now().time_since_epoch().count());
const int N = 1 << 12 | 3, lim = 6;
map<int, int> Map[N];
int n, p[N];
int qry(int x, int y) {
  if (x > y) swap(x, y);
  if (Map[x].count(y)) return Map[x][y];
  printf("? %d %d\n", x, y);
  fflush(stdout);
  int r;
  read(r);
  return Map[x][y] = r;
}
int main() {
  read(n);
  int a = R() % n + 1, b = R() % n + 1;
  while (1) {
    a = R() % n + 1, b = R() % n + 1;
    while (a == b) a = R() % n + 1, b = R() % n + 1;
    int all = qry(a, b);
    int pa = 0, push_back = 0;
    for (register int tt = (1); tt <= (lim); tt++)
      if (all) {
        int x = R() % n + 1;
        while (x == a || x == b) x = R() % n + 1;
        int A = qry(a, x), B = qry(b, x);
        for (register int i = (0); i <= (10); i++)
          if ((all >> i & 1) && (A >> i & 1) != (B >> i & 1)) {
            all ^= 1 << i;
            if (A >> i & 1)
              pa |= 1 << i;
            else
              push_back |= 1 << i;
          }
      }
    if (!all) {
      p[a] = pa;
      p[b] = push_back;
      break;
    }
  }
  static int id[N];
  int len = 0;
  for (register int i = (1); i <= (n); i++)
    if (i != a && i != b) id[++len] = i;
  int pos = -1;
  if (p[a] == 0) pos = a;
  if (p[b] == 0) pos = b;
  for (register int i = (1); i <= (len); i++) swap(id[i], id[R() % i + 1]);
  for (register int i = (1); i <= (len); i++)
    if (pos >= 0) {
      p[id[i]] = qry(id[i], pos);
    } else {
      p[id[i]] = (qry(id[i], a) & (~p[a])) | (qry(id[i], b) & (~p[b]));
      if (p[id[i]] == 0) pos = id[i];
    }
  printf("! ");
  for (register int i = (1); i <= (n); i++) printf("%d ", p[i]);
  fflush(stdout);
  return 0;
}
