#include using namespace std; using ll = long long; const ll mod = 1e9 + 7; const int N = 200005; const int INF = 0x3f3f3f3f; namespace FastIO { const int SIZ = 1 << 20; char ibuf[SIZ], *iS, *iT; char obuf[SIZ], *oS = obuf, *oT = obuf + SIZ - 1; inline char getch() { return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZ, stdin), (iS == iT ? EOF : *iS++)) : *iS++); } template inline void read(T& x) { char c = getch(); x = 0; bool f = 0; while (!isdigit(c)) { if (c == '-') f = 1; c = getch(); } while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getch(); } if (f) x = -x; } inline void read(char& c) { while ((c = getch()) <= 32); } inline void read(char* s) { char c = getch(); while (c <= 32) c = getch(); while (c > 32) { *s++ = c; c = getch(); } *s = '\0'; } inline void read(string& s) { s.clear(); char c = getch(); while (c <= 32) c = getch(); while (c > 32) { s += c; c = getch(); } } inline void flush() { fwrite(obuf, 1, oS - obuf, stdout); oS = obuf; } inline void putch(char x) { *oS++ = x; if (oS == oT) flush(); } template inline void write(T x) { if (x < 0) { putch('-'); x = -x; } if (x > 9) write(x / 10); putch(x % 10 + 48); } inline void write(const char* s) { while (*s) putch(*s++); } inline void write(const string& s) { for (char c : s) putch(c); } struct IO { ~IO() { flush(); } template IO& operator>>(T& x) { read(x); return *this; } template IO& operator<<(const T& x) { write(x); return *this; } } io; } // namespace FastIO using namespace FastIO; using i128 = __int128; using u128 = __uint128_t; using ull = unsigned long long; template constexpr std::make_unsigned_t gcd(T a, T b) { using U = std::make_unsigned_t; U m = a < 0 ? U(-a) : U(a); U n = b < 0 ? U(-b) : U(b); if (m == 0) return n; if (n == 0) return m; int i = __builtin_ctz(m); m >>= i; int j = __builtin_ctz(n); n >>= j; int k = min(i, j); while (true) { if (m > n) swap(m, n); n -= m; if (n == 0) return m << k; n >>= __builtin_ctz(n); } } inline int lg(int __n) { return sizeof(int) * __CHAR_BIT__ - 1 - __builtin_clz(__n); } ll powmod(ll x, ll y, ll m = mod) { ll res = 1; while (y) { if (y & 1) res = res * x % m; y >>= 1; x = x * x % m; } return res; } int n; int cc[1005][1005]; int A[N]; int ask() { cout << "?"; for (int i = 0; i < n; i++) cout << " " << A[i]; cout << "\n"; cout.flush(); int res; cin >> res; return res; } bool cmp(int x, int y) { if (cc[x][y] != 0) return cc[x][y] == 1; auto work = [&](bool res) { cc[x][y] = res ? 1 : -1; cc[y][x] = res ? -1 : 1; return res; }; fill(A, A + n, 1); A[x] = 0, A[y] = 2; if (ask() == 3) return work(true); fill(A, A + n, 1); A[x] = 2, A[y] = 0; if (ask() == 3) return work(false); if (n == 2) { fill(A, A + n, 0); A[x] = 0, A[y] = 1; return work(ask() == 2); } else { fill(A, A + n, 0); A[x] = 1, A[y] = 2; if (ask() == 3) return work(true); fill(A, A + n, 2); A[x] = 0, A[y] = 1; if (ask() == 3) return work(true); return work(false); } } int P[N]; int main() { cin >> n; for (int i = 0; i < n; i++) P[i] = i; stable_sort(P, P + n, cmp); cout << "!"; for (int i = 0; i < n; i++) cout << " " << P[i]; cout << "\n"; cout.flush(); return 0; }