#include <bits/stdc++.h>
using namespace std;
template <class T>
void Output(const vector<T> &v) {
  for (int i = 0; i < v.size(); ++i) {
    cout << v[i];
    if (i < v.size() - 1)
      cout << " ";
    else
      cout << endl;
  }
}
template <class T>
void Input(vector<T> &v, int n) {
  v.resize(n);
  for (int i = 0; i < n; ++i) {
    cin >> v[i];
  }
}
vector<int> R;
int query_count = 0;
map<int, int> cache;
int query(int a, int b) {
  if (a > b) swap(a, b);
  int k = a * 100000 + b;
  auto it = cache.find(k);
  if (it != cache.end()) {
    return it->second;
  }
  ++query_count;
  cout << "? " << (a + 1) << " " << (b + 1) << endl;
  cout.flush();
  if (R.size() > 0) {
    cache[k] = (R[a] | R[b]);
    return R[a] | R[b];
  }
  int r;
  cin >> r;
  cache[k] = r;
  return r;
}
void battle(vector<int> &s) {
  int a_b = query(s[0], s[1]);
  int b_c = query(s[1], s[2]);
  set<int> filter;
  if (a_b == b_c) {
    filter.insert(1);
  } else if (a_b > b_c) {
    filter.insert(0);
  } else {
    filter.insert(2);
  }
  vector<int> new_s;
  for (int j = 0; j < 3; ++j) {
    if (filter.find(j) == filter.end()) {
      new_s.push_back(s[j]);
    }
  }
  s = new_s;
}
int main() {
  int n;
  cin >> n;
  vector<int> c;
  for (int i = 0; i < n; ++i) {
    c.push_back(i);
  }
  default_random_engine defaultEngine;
  std::shuffle(c.begin(), c.end(), defaultEngine);
  vector<int> s;
  int k = 0;
  while (c.size() + s.size() >= 3) {
    while (s.size() < 3) {
      s.push_back(c.back());
      c.pop_back();
    }
    battle(s);
  }
  while (c.size() > 0) {
    s.push_back(c.back());
    c.pop_back();
  }
  int key = -1;
  if (s.size() == 2) {
    vector<int> new_s;
    for (int i = 0; i < n; ++i) {
      if (i != s[0] && i != s[1]) {
        int a_c = query(s[0], i);
        int b_c = query(s[1], i);
        if (a_c < b_c) {
          key = s[0];
          break;
        }
        if (b_c < a_c) {
          key = s[1];
          break;
        }
      }
    }
  } else {
    key = s[0];
  }
  vector<int> result;
  for (int i = 0; i < n; ++i) {
    if (i == key) {
      result.push_back(0);
    } else {
      result.push_back(query(key, i));
    }
  }
  cout << "! ";
  Output(result);
  return 0;
}
