#include using namespace std; int ask(const vector& q) { cout << 0; for (int x : q) cout << ' ' << x; cout << endl; int res; cin >> res; return res; } void guess(const vector& p) { cout << 1; for (int x : p) cout << ' ' << x; cout << endl; exit(0); } int main() { int n; cin >> n; if (n == 1) { guess({1}); } vector pos(n + 1, -1); // pos[value] = position (1-indexed) vector unknown; for (int i = 1; i <= n; ++i) unknown.push_back(i); // Step 1: find positions of 1 and 2 for (int i = 1; i <= n && (pos[1] == -1 || pos[2] == -1); ++i) { vector q(n); for (int j = 1; j <= n; ++j) { if (j == i) q[j-1] = 1; else q[j-1] = 2; } int r = ask(q); if (r == 2) pos[1] = i; else if (r == 0) pos[2] = i; } // Remove found positions from unknown unknown.clear(); for (int i = 1; i <= n; ++i) { if (i != pos[1] && i != pos[2]) unknown.push_back(i); } // Step 2: find positions for values 3..n using binary search for (int v = 3; v <= n; ++v) { int m = unknown.size(); if (m == 1) { pos[v] = unknown[0]; break; } int lo = 0, hi = m - 1; while (lo < hi) { int mid = (lo + hi) / 2; vector q(n); // set known positions for (int w = 1; w < v; ++w) { q[pos[w] - 1] = w; } // set first half of unknown to v for (int i = lo; i <= mid; ++i) { int idx = unknown[i]; q[idx - 1] = v; } // set the rest of unknown to 1 (already placed, so no match) for (int i = mid + 1; i < m; ++i) { int idx = unknown[i]; q[idx - 1] = 1; } int r = ask(q); if (r == v) { // pos[v] is in the first half hi = mid; } else { // r == v-1, pos[v] is in the second half lo = mid + 1; } } pos[v] = unknown[lo]; unknown.erase(unknown.begin() + lo); } // Build the permutation from the positions vector ans(n); for (int v = 1; v <= n; ++v) { ans[pos[v] - 1] = v; } guess(ans); return 0; }