#include <bits/stdc++.h>
#define int long long
#define REP(i,a,b) for(int i = a; i<b; i++)
#define RREP(i,a,b) for(int i = a; i>b; i--)
using namespace std;
int INF = 1e18,mx,p,val;
vector<int> res;
void update(int a, int b){
cout<<"? "<<a+1<<' '<<b+1<<endl;
cin>>val;
if(val==res[mx]) {
res[b] = val;
int tmp = p;
p = mx;
mx = b;
update(b,tmp);
}
else if(val>res[mx]){
res[mx] = val;
res[b] = val;
}
else res[b] = val;
}
int32_t main() {
int n;
cin>>n;
res.resize(n);
if(n<=3){
REP(i,0,n-1){
REP(j,i+1,n){
cout<<"? "<<i+1<<' '<<j+1<<endl;
cin>>val;
res[i] = max(res[i],val);
res[j] = max(res[j],val);
}
}
}
else{
REP(i,0,2){
REP(j,i+1,3){
cout<<"? "<<i+1<<' '<<j+1<<endl;
cin>>val;
res[i] = max(res[i],val);
res[j] = max(res[j],val);
}
}
mx = max_element(res.begin(),res.begin()+3)-res.begin();
p = max_element(res.begin()+mx+1,res.begin()+3)-res.begin();
REP(i,3,n){
if(i == mx) continue;
update(mx,i);
}
}
cout<<"! ";
REP(i,0,n){
cout<<res[i]<<' ';
}
cout<<endl;
}