| #include <iostream> |
| #include <vector> |
| #include <algorithm> |
| using namespace std; |
|
|
| int main() { |
| int n; |
| cin >> n; |
|
|
| vector<int> val_at_pos(n + 1, 0); |
| vector<int> pos_of_val(n + 1, 0); |
| vector<int> undetermined; |
|
|
| |
| for (int i = 1; i <= n; ++i) { |
| cout << 0; |
| for (int j = 1; j <= n; ++j) { |
| if (j == i) cout << " 2"; |
| else cout << " 1"; |
| } |
| cout << endl; |
| cout.flush(); |
|
|
| int ans; |
| cin >> ans; |
| if (ans == 0) { |
| |
| val_at_pos[i] = 1; |
| pos_of_val[1] = i; |
| } else if (ans == 2) { |
| |
| val_at_pos[i] = 2; |
| pos_of_val[2] = i; |
| } |
| |
| } |
|
|
| |
| for (int i = 1; i <= n; ++i) { |
| if (val_at_pos[i] == 0) { |
| undetermined.push_back(i); |
| } |
| } |
|
|
| |
| for (int v = 3; v <= n; ++v) { |
| if (undetermined.empty()) break; |
| int m = undetermined.size(); |
| if (m == 1) { |
| |
| int pos = undetermined[0]; |
| val_at_pos[pos] = v; |
| pos_of_val[v] = pos; |
| undetermined.pop_back(); |
| continue; |
| } |
|
|
| int d = 0; |
| while ((1 << d) < m) ++d; |
|
|
| int idx_v = 0; |
| for (int bit = 0; bit < d; ++bit) { |
| |
| vector<int> q(n + 1, 0); |
| |
| for (int i = 1; i <= n; ++i) { |
| if (val_at_pos[i] != 0) { |
| q[i] = val_at_pos[i]; |
| } |
| } |
| |
| for (int j = 0; j < m; ++j) { |
| int i = undetermined[j]; |
| if ((j >> bit) & 1) { |
| q[i] = v; |
| } else { |
| q[i] = 1; |
| } |
| } |
|
|
| cout << 0; |
| for (int i = 1; i <= n; ++i) { |
| cout << " " << q[i]; |
| } |
| cout << endl; |
| cout.flush(); |
|
|
| int ans; |
| cin >> ans; |
| if (ans == v) { |
| idx_v |= (1 << bit); |
| } |
| |
| } |
|
|
| |
| int pos = undetermined[idx_v]; |
| val_at_pos[pos] = v; |
| pos_of_val[v] = pos; |
|
|
| |
| swap(undetermined[idx_v], undetermined[m - 1]); |
| undetermined.pop_back(); |
| } |
|
|
| |
| cout << 1; |
| for (int i = 1; i <= n; ++i) { |
| cout << " " << val_at_pos[i]; |
| } |
| cout << endl; |
| cout.flush(); |
|
|
| return 0; |
| } |