#include<bits/stdc++.h>
using namespace std;
#define time chrono::system_clock::now().time_since_epoch().count()
mt19937_64 rnd(time);
#define maxn 2005
#define int long long
const int mod = 998244353;
int read() {int x;cin>>x;return x;}
int mp[maxn][maxn], ff[maxn][maxn];
int ask(int l, int r) {
if(l == r) return 1;
if(mp[l][r]) return mp[l][r];
if(ff[l][r]) return ff[l][r];
cout << "? " << l << " " << r << endl;
int x = read();
mp[l][r] = x;
return x;
}
map<int, int> vis;
int get() {
int val;
while(1) {
val = rnd() % mod + 1;
if(!vis[val]) {
vis[val] = 1;
break;
}
}
return val;
}
// int f[maxn][maxn];
struct SAM{
int left, tot=1,lt=1,num,l[maxn],sz[maxn],f[maxn],last[maxn];
map<int, int> ch[maxn];
void insert(int c, int r){
int v=++tot,u=lt;lt=tot;
sz[v]=1;l[v]=l[u]+1;
while(u&&!ch[u][c]) {ch[u][c]=v;u=f[u];}
if(!u) {f[v]=1; ff[left][r] += l[v] - l[f[v]]; return;}
int x=ch[u][c];
if(l[x]==l[u]+1) {f[v]=x; ff[left][r] += l[v] - l[f[v]]; return;}
int y=++tot;
ff[left][r] -= l[x] - l[f[x]];
l[y]=l[u]+1;
f[y]=f[x]; ff[left][r] += l[y] - l[f[y]];
f[x]=f[v]=y; ff[left][r] += l[x] - l[f[x]] + l[v] - l[f[v]];
ch[y] = ch[x];
// memcpy(ch[y],ch[x],sizeof(ch[x]));
while(u&&ch[u][c]==x) {ch[u][c]=y;u=f[u];}
}
}sam[maxn];
void solve() {
int n = read();
vector<int> ans(n + 1);
ans[1] = get();
for(int i = 1; i <= n; i++) sam[i].left = i;
sam[1].insert(ans[1], 1);
for(int i = 2; i <= n; i++) {
int l = 1, r = i - 1;
while(l <= r) {
int mid = (l + r) >> 1;
int len = i - mid + 1, need = len * (len + 1) / 2;
if(ask(mid, i) - ask(mid, i - 1) == i - mid + 1) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
// cout << i << " -> " << r << "!!\n";
if(r == 0) ans[i] = get();
else ans[i] = ans[r];
for(int j = 1; j <= i; j++) {
sam[j].insert(ans[i], i);
}
// if(i == 2 || i == 3) {
// for(int j = 1; j <= 3; j++) {
ff[j][i] += ff[j][i - 1];
// cout << j << " " << i << " " << ff[j][i] << "\n";
// }
// }
}
cout << "! ";
for(int i = 1; i <= n; i++) {
cout << ans[i] << " ";
}
cout << endl;
}
signed main() {
solve();
return 0;
}