#include #include #include using namespace std; int ask(const vector& q) { cout << "0"; for (size_t i = 1; i < q.size(); ++i) { cout << " " << q[i]; } cout << endl; cout.flush(); int response; cin >> response; return response; } void guess(const vector& ans) { cout << "1"; for (size_t i = 1; i < ans.size(); ++i) { cout << " " << ans[i]; } cout << endl; cout.flush(); } int main() { int n; cin >> n; vector ans(n + 1, 0); if (n == 1) { cout << "1 1" << endl; return 0; } if (n == 2) { vector q1 = {0, 1, 1}; int r1 = ask(q1); vector q2 = {0, 1, 2}; int r2 = ask(q2); if (r2 == 2) { ans[1] = 1; ans[2] = 2; } else { ans[1] = 2; ans[2] = 1; } guess(ans); return 0; } vector undet; for (int i = 1; i <= n; ++i) undet.push_back(i); set detPos; for (int v = 1; v <= n; ++v) { if (undet.empty()) break; if (v == 1) { int L = 0, R = undet.size() - 1; while (L < R) { int mid = (L + R) / 2; int a = 1, b = 2; if (a == v) a = 2; b = a + 1; if (b == v) ++b; if (b > n) { b = 1; if (b == v) ++b; if (b == a) ++b; } vector qA(n + 1, 0); for (int i = L; i <= mid; ++i) qA[undet[i]] = v; for (int i = mid + 1; i <= R; ++i) qA[undet[i]] = a; int rA = ask(qA); vector qB(n + 1, 0); for (int i = L; i <= mid; ++i) qB[undet[i]] = v; for (int i = mid + 1; i <= R; ++i) qB[undet[i]] = b; int rB = ask(qB); int X; if (rA == rB) X = rA; else if (rA == rB + 1) X = rA - 1; else if (rA + 1 == rB) X = rB - 1; else { if (rA > rB) X = rA - 1; else X = rB - 1; } if (X == 1) R = mid; else L = mid + 1; } int pos = undet[L]; ans[pos] = v; undet.erase(undet.begin() + L); detPos.insert(pos); } else { int f = ans[*detPos.begin()]; int L = 0, R = undet.size() - 1; while (L < R) { int mid = (L + R) / 2; vector q(n + 1, 0); for (int p : detPos) q[p] = ans[p]; for (int i = L; i <= mid; ++i) q[undet[i]] = v; for (int i = mid + 1; i <= R; ++i) q[undet[i]] = f; int r = ask(q); int D = detPos.size(); if (r == D + 1) R = mid; else L = mid + 1; } int pos = undet[L]; ans[pos] = v; undet.erase(undet.begin() + L); detPos.insert(pos); } } guess(ans); return 0; }