module main; // https://yukicoder.me/submissions/46424 より // インタラクティブ問題、バイトニックソート import std; // ceil(log_2(n))を求める int ceilLog2(T)(T n) { int x = 0; T one = 1; while (one << x < n) x++; return x; } void main() { // 入力 int N = readln.chomp.to!int; // 答えの計算と出力 int M = ceilLog2(N); auto A = new int[](1 << M); foreach (i; 0 .. N) A[i] = i + 1; foreach (fb; 1 .. M + 1) { foreach_reverse (sb; 0 .. fb) { auto Q = new int[](2 * N); auto pos = new int[](2 * N); int p = 0; foreach (i; 0 .. 1 << M) { if (((i >> fb) & 1) ^ ((i >> sb) & 1)) { if (A[i] == 0) { swap(A[i], A[i ^ (1 << sb)]); continue; } else if (A[i ^ (1 << sb)] == 0) continue; pos[p] = i; Q[p++] = A[i]; pos[p] = i ^ (1 << sb); Q[p++] = A[i ^ (1 << sb)]; } } writefln("? %(%d %)", Q); stdout.flush; auto ans = readln.split; for (int i = 0; i < p; i += 2) { int l = pos[i], r = pos[i + 1]; if (ans[i / 2] == "<") swap(A[l], A[r]); } } } A = A.remove!(a => a == 0); writefln("! %(%d %)", A); stdout.flush; }