#line 2 "library/template/template.hpp" #include using namespace std; #line 2 "library/template/macro.hpp" #define rep(i, a, b) for (int i = (a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (a); i--) #define ALL(v) (v).begin(), (v).end() #define UNIQUE(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end()) #define SZ(v) (int)v.size() #define MIN(v) *min_element(ALL(v)) #define MAX(v) *max_element(ALL(v)) #define LB(v, x) int(lower_bound(ALL(v), (x)) - (v).begin()) #define UB(v, x) int(upper_bound(ALL(v), (x)) - (v).begin()) #define YN(b) cout << ((b) ? "YES" : "NO") << "\n"; #define Yn(b) cout << ((b) ? "Yes" : "No") << "\n"; #define yn(b) cout << ((b) ? "yes" : "no") << "\n"; #line 6 "library/template/template.hpp" #line 2 "library/template/util.hpp" using uint = unsigned int; using ll = long long int; using ull = unsigned long long; using i128 = __int128_t; using u128 = __uint128_t; template S SUM(const vector& a) { return accumulate(ALL(a), S(0)); } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template int popcnt(T x) { return __builtin_popcountll(x); } template int topbit(T x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } template int lowbit(T x) { return (x == 0 ? -1 : __builtin_ctzll(x)); } #line 8 "library/template/template.hpp" #line 2 "library/template/inout.hpp" struct Fast { Fast() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); } } fast; ostream& operator<<(ostream& os, __uint128_t x) { char buf[40]; size_t k = 0; while (x > 0) buf[k++] = (char)(x % 10 + '0'), x /= 10; if (k == 0) buf[k++] = '0'; while (k) os << buf[--k]; return os; } ostream& operator<<(ostream& os, __int128_t x) { return x < 0 ? (os << '-' << (__uint128_t)(-x)) : (os << (__uint128_t)x); } template istream& operator>>(istream& is, pair& p) { return is >> p.first >> p.second; } template ostream& operator<<(ostream& os, const pair& p) { return os << p.first << " " << p.second; } template istream& operator>>(istream& is, vector& a) { for (auto& v : a) is >> v; return is; } template ostream& operator<<(ostream& os, const vector& a) { for (auto it = a.begin(); it != a.end();) { os << *it; if (++it != a.end()) os << " "; } return os; } template ostream& operator<<(ostream& os, const set& st) { os << "{"; for (auto it = st.begin(); it != st.end();) { os << *it; if (++it != st.end()) os << ","; } os << "}"; return os; } template ostream& operator<<(ostream& os, const map& mp) { os << "{"; for (auto it = mp.begin(); it != mp.end();) { os << it->first << ":" << it->second; if (++it != mp.end()) os << ","; } os << "}"; return os; } void in() {} template void in(T& t, U&... u) { cin >> t; in(u...); } void out() { cout << "\n"; } template void out(const T& t, const U&... u) { cout << t; if (sizeof...(u)) cout << sep; out(u...); } namespace IO { namespace Graph { vector> unweighted(int n, int m, bool directed = false, int offset = 1) { vector> g(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u -= offset, v -= offset; g[u].push_back(v); if (!directed) g[v].push_back(u); } return g; } template vector>> weighted(int n, int m, bool directed = false, int offset = 1) { vector>> g(n); for (int i = 0; i < m; i++) { int u, v; T w; cin >> u >> v >> w; u -= offset, v -= offset; g[u].push_back({v, w}); if (!directed) g[v].push_back({u, w}); } return g; } } // namespace Graph namespace Tree { vector> unweighted(int n, bool directed = false, int offset = 1) { return Graph::unweighted(n, n - 1, directed, offset); } template vector>> weighted(int n, bool directed = false, int offset = 1) { return Graph::weighted(n, n - 1, directed, offset); } vector> rooted(int n, bool to_root = true, bool to_leaf = true, int offset = 1) { vector> g(n); for (int i = 1; i < n; i++) { int p; cin >> p; p -= offset; if (to_root) g[i].push_back(p); if (to_leaf) g[p].push_back(i); } return g; } } // namespace Tree } // namespace IO #line 10 "library/template/template.hpp" #line 2 "library/template/debug.hpp" #ifdef LOCAL #define debug 1 #define show(...) _show(0, #__VA_ARGS__, __VA_ARGS__) #else #define debug 0 #define show(...) true #endif template void _show(int i, T name) { cerr << '\n'; } template void _show(int i, const T1& a, const T2& b, const T3&... c) { for (; a[i] != ',' && a[i] != '\0'; i++) cerr << a[i]; cerr << ":" << b << " "; _show(i + 1, a, c...); } #line 2 "main.cpp" #line 2 "library/util/xorshift.hpp" namespace XORShift { unsigned int xor32() { static unsigned int x = 123456789u; x ^= x << 13, x ^= x >> 17, x ^= x << 5; return x; } unsigned long long xor64() { static unsigned long long x = 123456789ull; x ^= x << 13, x ^= x >> 7, x ^= x << 17; return x; } }; // namespace XORShift /** * @brief XOR shift */ #line 4 "main.cpp" template void shuffle(Iter begin, Iter end) { if (begin == end) return; int n = end - begin; for (int i = n - 1; i > 0; i--) { int j = XORShift::xor32() % (i + 1); if (j < i) swap(*(begin + i), *(begin + j)); } } void solve() { int pl; in(pl); int N, M; in(N, M); vector C(N); in(C); // rep(i, 0, N - 1) assert(C[i] <= C[i + 1]); sort(ALL(C)); vector a; auto dfs = [&](auto dfs, ll v, int k, int rem) -> void { if (k > M) { if (rem == 0) a.push_back(v); } else { ll w = v; rep(i, 0, k + 1) { if (rem - i < 0) break; dfs(dfs, w, k + 1, rem - i); w = w * M + k - 1; } } }; dfs(dfs, 0, 1, N); shuffle(ALL(a)); // M ** L >= a.size() int L = 0; for (ll p = 1; p < a.size(); p *= M) L++; ll z = 0; for (auto v : C) z = z * M + v - 1; int id1 = 0; while (a[id1] != z) id1++; int id2 = 0; vector cnt(M + 1, -1); { int x = id1; int p = 1; rep(_, 0, L * 2) { string t; in(t); bool turn = t[0] == 'T'; if (turn) { out("ASK", x % M + 1); x /= M; cout.flush(); } in(t); assert(t[0] == 'C'); int X, K; in(X, K); cnt[X] = K; if (!turn) { id2 += p * (X - 1); p *= M; } } } int y = -1; { int r = 0; rep(k, 1, M + 1) if (cnt[k] == -1) r++; int x = 1; while (r > 1) { while (x <= M && cnt[x] != -1) x++; if (x > M) break; string t; in(t); if (t[0] == 'T') { out("ASK", x); cout.flush(); } in(t); assert(t[0] == 'C'); int X, K; in(X, K); cnt[X] = K; assert(X == x); r--; } if (r == 1) { y = 1; while (cnt[y] != -1) y++; cnt[y] = 3 * N; rep(k, 1, M + 1) if (k != y) cnt[y] -= cnt[k]; } } for (auto v : C) cnt[v]--; z = a[id2]; rep(_, 0, N) { cnt[z % M + 1]--; z /= M; } vector ans; rep(v, 1, M + 1) { assert(cnt[v] >= 0); rep(_, 0, cnt[v]) ans.push_back(v); } assert(ans.size() == N); rep(_, 0, 2) { string s; in(s); if (s[0] == 'T') { out("GUESS", ans); cout.flush(); } in(s); assert(s[0] == 'G'); int id, ok; in(id, ok); } { string t; int q; in(t, q); assert(t[0] == 'E'); } } int main() { int t = 1; // in(t); while (t--) solve(); }