#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
using namespace std;
const int N = 500003, M = 10003, inf = 0x3f3f3f3f, mod = 1e9 + 7;
typedef pair<int, int> PIR;
typedef long long ll;
const char space = ' ';
int res[M];
bool vis[M],has[M];
//每两次交互x,y, y,x可以确定较小的那个数
int main()
{
int n;
cin >> n;
for (int i = 1; i <n; i++)
{
int x, y;
int flag = 1;
for (int j = 1; j <= n; j++)
{
if (!vis[j])
{
if (flag)
{
x = j;
flag = 0;
}
else
{
y = j;
break;
}
}
}
cout << '?' << space << x << space << y<<endl;
cout.flush();
int t1, t2;
cin >> t1;
cout << '?' << space << y << space << x<<endl;
cout.flush();
cin >> t2;
if (t1 < t2)
{
res[y] = t2;
vis[y] = true;
has[t2] = true;
}
else
{
res[x] = t1;
vis[x] = true;
has[t1] = true;
}
}
cout << '!';
int t;
for (int i = 1; i <= n; i++)
if (!has[i])
{
t = i;
break;
}
for (int i = 1; i <= n; i++)
{
cout << space;
if (res[i])
cout << res[i];
else
cout << t;
}
/*cout << endl;
for (int i = 1; i <= n; i++)
cout << vis[i] << ' ' << res[i] << endl;
*/
return 0;
}