File size: 3,004 Bytes
14c9c2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> perm;

void output_query(const vector<int>& qq) {
    cout << 0;
    for (int j = 1; j <= n; ++j) {
        cout << " " << qq[j];
    }
    cout << endl;
    cout.flush();
}

int read_response() {
    int x;
    cin >> x;
    return x;
}

void solve(const vector<int>& positions, const vector<int>& values,
           const vector<pair<vector<int>, int>>& externals) {
    int m = positions.size();
    if (m == 0) return;
    if (m == 1) {
        perm[positions[0]] = values[0];
        return;
    }
    int half = m / 2;
    vector<int> left_pos(positions.begin(), positions.begin() + half);
    vector<int> right_pos(positions.begin() + half, positions.end());
    int uu = values[0];
    vector<int> xx(m);
    for (int i = 0; i < m; ++i) {
        int w = values[i];
        vector<int> qq(n + 1, 0);
        // set known
        for (int j = 1; j <= n; ++j) {
            if (perm[j] != 0) {
                qq[j] = perm[j];
            }
        }
        // set current left to w
        for (int j : left_pos) {
            qq[j] = w;
        }
        // set current right_sub to uu
        for (int j : right_pos) {
            qq[j] = uu;
        }
        // set externals
        for (const auto& ex : externals) {
            for (int j : ex.first) {
                qq[j] = ex.second;
            }
        }
        output_query(qq);
        xx[i] = read_response();
    }
    // determine left_vals
    int minx = *min_element(xx.begin(), xx.end());
    vector<int> leftv;
    for (int i = 0; i < m; ++i) {
        if (xx[i] == minx + 1) {
            leftv.push_back(values[i]);
        }
    }
    if ((int)leftv.size() != (int)left_pos.size()) {
        // fallback, perhaps all same, but shouldn't happen
        leftv.clear();
        for (int i = 0; i < m; ++i) {
            if (xx[i] == maxx) {  // try max
                leftv.push_back(values[i]);
            }
        }
    }
    vector<int> rightv;
    set<int> left_set(leftv.begin(), leftv.end());
    for (int vv : values) {
        if (left_set.find(vv) == left_set.end()) {
            rightv.push_back(vv);
        }
    }
    // recurse left
    vector<pair<vector<int>, int>> ext_left = externals;
    if (!rightv.empty()) {
        ext_left.emplace_back(right_pos, rightv[0]);
    }
    solve(left_pos, leftv, ext_left);
    // recurse right
    vector<pair<vector<int>, int>> ext_right = externals;
    solve(right_pos, rightv, ext_right);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    perm.assign(n + 1, 0);
    vector<int> poss(n);
    for (int i = 0; i < n; ++i) poss[i] = i + 1;
    vector<int> vals(n);
    for (int i = 0; i < n; ++i) vals[i] = i + 1;
    vector<pair<vector<int>, int>> empty_ext;
    solve(poss, vals, empty_ext);
    // now output the guess
    cout << 1;
    for (int j = 1; j <= n; ++j) {
        cout << " " << perm[j];
    }
    cout << endl;
    cout.flush();
    return 0;
}