#include namespace { using namespace std; #define rep(i,n) for(int i = 0; i < (int)(n); i++) #define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) template bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; } template bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; } using ll = long long; using P = pair; using VI = vector; using VVI = vector; using VL = vector; using VVL = vector; } int main() { ios::sync_with_stdio(false); cin.tie(0); int id, n, m; cin >> id >> n >> m; VI c(n); rep(i, n) cin >> c[i]; int cnt = 0; array cf{}; for (int x : c) cf[x]++; array now{}; int cid = -1; auto dfs1 = [&](auto&& self, int i, int rest) -> void { if (rest == 0 || i == m) { if (rest <= m) { now[i] = rest; if (now == cf) cid = cnt; cnt++; } now[i] = 0; return; } rep(c, min(i, rest) + 1) now[i] = c, self(self, i + 1, rest - c); now[i] = 0; }; dfs1(dfs1, 1, n); cout << cnt << ' ' << cid << endl; int t = 0, m2t = 1; while (m2t < cnt) t++, m2t *= m; cout << t << ' ' << m2t << ' ' << cnt << ' ' << cid << endl; VI v1, v2; int memo[12]; rep(i, 12) memo[i] = -1; auto ask = [&](int i) { cout << "ASK " << i << endl; }; int cid_tmp = cid; rep(_, t) { string turn; cin >> turn; if (turn == "TURN") { assert(id == 1); ask(cid_tmp % m + 1); cid_tmp /= m; } else { assert(turn == "WAIT" && id == 2); } cin >> turn; assert(turn == "COUNT"); int x, k; cin >> x >> k; memo[x] = k; v1.emplace_back(x-1); cin >> turn; if (turn == "TURN") { assert(id == 2); ask(cid_tmp % m + 1); cid_tmp /= m; } else { assert(turn == "WAIT" && id == 1); } cin >> turn; assert(turn == "COUNT"); cin >> x >> k; memo[x] = k; v2.emplace_back(x-1); } int id1 = 0, id2 = 0; for (int x : v1 | views::reverse) id1 = m * id1 + x; for (int x : v2 | views::reverse) id2 = m * id2 + x; cnt = 0; array f1{}, f2{}; auto dfs2 = [&](auto&& self, int i, int rest) -> void { if (rest == 0 || i == m) { if (rest <= m) { now[i] = rest; if (cnt == id1) f1 = now; if (cnt == id2) f2 = now; cnt++; } now[i] = 0; return; } rep(c, min(i, rest) + 1) now[i] = c, self(self, i + 1, rest - c); now[i] = 0; }; dfs2(dfs2, 1, n); if (id == 1) assert(f1 == cf); else assert(f2 == cf); array f3{}; rep(i, m+1) if (f1[i] + f2[i] == i) memo[i] = i; rep(i, m+1) if (memo[i] != -1) { f3[i] = memo[i] - f1[i] - f2[i]; } while (accumulate(all(f3), 0) != n) { VI cands; rep(i, m+1) if (memo[i] == -1) cands.emplace_back(i); if (ssize(cands) == 1) { f3[cands[0]] = n - accumulate(all(f3), 0); continue; } int acc = 0; for (int v : cands) acc += v - f1[v] - f2[v]; if (acc + accumulate(all(f3), 0) == n) { for (int v : cands) f3[v] = v - f1[v] - f2[v]; continue; } int v = *ranges::max_element(cands, greater{}, [&](int v) { return v - f1[v] - f2[v]; }); string turn; cin >> turn; if (turn == "TURN") { ask(v); } else { assert("WAIT"); } cin >> turn; assert(turn == "COUNT"); int x, k; cin >> x >> k; assert(x == v); memo[x] = k; f3[x] = memo[x] - f1[x] - f2[x]; } rep(_, 2) { string turn; cin >> turn; if (turn == "TURN") { VI ans; rep(i, m+1) rep(_, f3[i]) ans.emplace_back(i); assert(ssize(ans) == n); cout << "GUESS"; for (int x : ans) cout << ' ' << x; cout << endl; } else { assert(turn == "WAIT"); } cin >> turn; assert(turn == "GUESSED"); int x, k; cin >> x >> k; } }