| #include <iostream> |
| #include <vector> |
| #include <numeric> |
| #include <algorithm> |
| #include <random> |
|
|
| using namespace std; |
|
|
| |
| int query(const vector<int>& q) { |
| cout << "0"; |
| for (int x : q) cout << " " << x; |
| cout << endl; |
| int res; |
| cin >> res; |
| return res; |
| } |
|
|
| |
| void guess(const vector<int>& p) { |
| cout << "1"; |
| for (int x : p) cout << " " << x; |
| cout << endl; |
| exit(0); |
| } |
|
|
| int main() { |
| |
| ios_base::sync_with_stdio(false); |
| cin.tie(NULL); |
|
|
| int n; |
| if (!(cin >> n)) return 0; |
|
|
| if (n == 1) { |
| guess({1}); |
| return 0; |
| } |
|
|
| vector<int> p(n + 1, 0); |
| |
| |
| |
| |
| |
| |
| |
| |
| vector<int> probe_order(n); |
| iota(probe_order.begin(), probe_order.end(), 1); |
| |
| mt19937 rng(1337); |
| shuffle(probe_order.begin(), probe_order.end(), rng); |
|
|
| int base_idx = -1; |
| int base_val = -1; |
|
|
| |
| for (int idx : probe_order) { |
| vector<int> q(n); |
| for (int i = 0; i < n; ++i) { |
| if (i + 1 == idx) q[i] = 1; |
| else q[i] = 2; |
| } |
| int res = query(q); |
| if (res == 2) { |
| base_idx = idx; |
| base_val = 1; |
| break; |
| } else if (res == 0) { |
| base_idx = idx; |
| base_val = 2; |
| break; |
| } |
| } |
|
|
| |
| p[base_idx] = base_val; |
| |
| |
| vector<int> available; |
| for (int i = 1; i <= n; ++i) { |
| if (i != base_idx) available.push_back(i); |
| } |
|
|
| |
| vector<int> to_find; |
| for (int v = 1; v <= n; ++v) { |
| if (v != base_val) to_find.push_back(v); |
| } |
|
|
| int found_count = 1; |
|
|
| |
| |
| for (int val : to_find) { |
| int l = 0; |
| int r = available.size() - 1; |
| |
| while (l < r) { |
| int mid = l + (r - l) / 2; |
| |
| |
| |
| |
| |
| |
| vector<int> q(n); |
| for(int i=1; i<=n; ++i) { |
| if(p[i] != 0) { |
| q[i-1] = p[i]; |
| } else { |
| q[i-1] = base_val; |
| } |
| } |
| |
| |
| for (int k = l; k <= mid; ++k) { |
| int idx = available[k]; |
| q[idx-1] = val; |
| } |
|
|
| int res = query(q); |
| |
| |
| if (res == found_count + 1) { |
| r = mid; |
| } else { |
| l = mid + 1; |
| } |
| } |
| |
| |
| int pos = available[l]; |
| p[pos] = val; |
| found_count++; |
| |
| |
| available.erase(available.begin() + l); |
| } |
|
|
| |
| vector<int> ans; |
| for (int i = 1; i <= n; ++i) ans.push_back(p[i]); |
| guess(ans); |
|
|
| return 0; |
| } |