#include using namespace std; typedef pair pii; typedef long long ll; typedef vector vi; #define pb push_back #define eb emplace_back #define mp make_pair #define fi first #define se second #define rep(i,n) rep2(i,0,n) #define rep2(i,m,n) for(int i=m;i<(n);i++) #define ALL(c) (c).begin(),(c).end() vector g[510]; set sh, sl; int l[510], r[510]; int N; bool vis[510]; void div(vi vec) { if (vec.size() <= 1) return ; memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r)); rep(i, vec.size()) { if (i & 1) r[i/2] = vec[i]; else l[i/2] = vec[i]; } cout << "?"; rep(i, N) cout << " " << l[i] << " " << r[i]; cout << endl; cout << flush; vi v1, v2; rep(i, N) { string s; cin >> s; if (!l[i]) continue; if (r[i]) { if (s[0] == '>') { g[l[i]].pb(r[i]); v1.pb(l[i]); v2.pb(r[i]); } else if (s[0] == '<') { g[r[i]].pb(l[i]); v2.pb(l[i]); v1.pb(r[i]); } } else v1.pb(l[i]); } div(v1); div(v2); } vi vs; void dfs(int v) { vis[v] = 1; for (int to : g[v]) if (!vis[to]) dfs(to); vs.pb(v); } int main() { cin >> N; vi v; rep(i, N) v.pb(i+1); div(v); rep(i, N) if (!vis[i+1]) { dfs(i+1); } cout << "!"; rep(i, N) cout << " " << vs[i]; cout << endl; return 0; }