#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, M = 26 + 5;
const long long INF = 1e18 + 5;
inline long long read() {
  long long sum = 0, fh = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') fh = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  return sum * fh;
}
inline int read2() {
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  return c - '0';
}
inline int read3() {
  char c = getchar();
  while (c < 'a' || c > 'z') {
    c = getchar();
  }
  return c - 'a';
}
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); }
inline long long ab(long long x) { return x < 0 ? -x : x; }
inline long long fpow(long long qwe, long long asd, long long zxc) {
  if (asd < 0) return 0;
  long long a = qwe, b = 1, c = asd;
  while (c) {
    if (c & 1) b = b * a % zxc;
    a = a * a % zxc;
    c >>= 1;
  }
  return b;
}
struct miaow {
  int l, r, x;
  miaow(int l = 0, int r = 0, int x = 0) : l(l), r(r), x(x) {}
};
vector<miaow> ans;
map<int, int> qwe;
inline int dfs(int l, int r, int x, int y) {
  if (l > r) return 0;
  cout << "? " << l << " " << r << endl;
  int a, b;
  cin >> a >> b;
  if (b == r - l + 1) {
    if (a == x) return l;
    ans.push_back(miaow(l, r, a));
    return 0;
  }
  if (a == x) {
    if (b != y) {
      dfs(l, r - b, 0, 0);
      return r - b + 1;
    } else {
      if (l == r) {
        ans.push_back(miaow(l, r, a));
        return 0;
      }
      int mid = (l + r) >> 1;
      int z = dfs(l, mid, x, y);
      if (z) {
        ans.push_back(miaow(z, z + y - 1, x));
        dfs(z + y, r, 0, 0);
      } else {
        dfs(mid + 1, r, 0, 0);
      }
      return 0;
    }
  } else {
    if (l == r) {
      ans.push_back(miaow(l, r, a));
      return 0;
    }
    int mid = (l + r) >> 1;
    int z = dfs(l, mid, a, b);
    if (z) {
      ans.push_back(miaow(z, z + b - 1, a));
      return dfs(z + b, r, x, y);
    } else
      return dfs(mid + 1, r, x, y);
  }
}
int sz[N];
int main() {
  int n = read();
  dfs(1, n, 0, 0);
  for (int i = 0; i < ans.size(); ++i) {
    for (int j = ans[i].l; j <= ans[i].r; ++j) {
      sz[j] = ans[i].x;
    }
  }
  cout << "! ";
  for (int i = 1; i <= n; ++i) {
    cout << sz[i] << " ";
  }
  fflush(stdout);
  return 0;
}
