#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const vector &as); template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") // [l, r)^n, sum = s template void doArraysWithSumRec(int n, int l, int r, int s, F f, int i, vector &as) { if (i == n) { f(as); } else { const int ll = max(l, s - (n - i - 1) * (r - 1)); const int rr = min(r - 1, s - (n - i - 1) * l); for (as[i] = ll; as[i] <= rr; ++as[i]) doArraysWithSumRec(n, l, r, s - as[i], f, i + 1, as); } } template void doArraysWithSum(int n, int l, int r, int s, F f) { vector as(n); if (n * l <= s && s <= n * (r - 1)) doArraysWithSumRec(n, l, r, s, f, 0, as); } void exper() { for (int M = 4; M <= 11; ++M) for (int N = 2; N <= 18; ++N) if (3*N <= M*(M+1)/2) { Int way = 0; doArraysWithSum(M, 0, N + 1, N, [&](const vector &fs) -> void { for (int m = 1; m <= M; ++m) if (fs[m - 1] > m) return; ++way; }); Int fac = 1; for (int i = 1; i <= M; ++i) fac *= i; cerr << "M = " << M << ", N = " << N << ": way = " << way << ", fac = " << fac << endl; assert(way <= fac); } } int main() { // exper(); int I, N, M; scanf("%d%d%d", &I, &N, &M); vector C(N); for (int n = 0; n < N; ++n) scanf("%d", &C[n]); /* vector> F; doArraysWithSum(M, 0, N + 1, N, [&](vector fs) -> void { fs.insert(fs.begin(), 0); for (int m = 1; m <= M; ++m) if (fs[m] > m) return; F.push_back(fs); }); const int FLen = F.size(); */ int FLen = 0; doArraysWithSum(M, 0, N + 1, N, [&](const vector &fs) -> void { for (int m = 1; m <= M; ++m) if (fs[m - 1] > m) return; ++FLen; }); vector> P; P.reserve(FLen); { basic_string ps(M, -1); for (int m = 1; m <= M; ++m) ps[m - 1] = m; do { P.push_back(ps); if ((int)P.size() >= FLen) break; } while (next_permutation(ps.begin(), ps.end())); } vector freq(M + 1, 0); for (int n = 0; n < N; ++n) ++freq[C[n]]; // const int my = lower_bound(F.begin(), F.end(), freq) - F.begin(); int my = -1; { int id = -1; doArraysWithSum(M, 0, N + 1, N, [&](const vector &fs) -> void { for (int m = 1; m <= M; ++m) if (fs[m - 1] > m) return; ++id; for (int m = 1; m <= M; ++m) if (fs[m - 1] != freq[m]) return; my = id; }); } vector total(M + 1, -1); basic_string ms; for (int q = 0; q < (M-1) * 2; ++q) { char msg[10]; scanf("%s", msg); if (string(msg) == "TURN") { const int m = P[my][q / 2]; printf("ASK %d\n", m); fflush(stdout); int X, K; scanf("%*s%d%d", &X, &K); assert(m == X); if (!~total[m]) total[m] = K; assert(total[m] == K); } else if (string(msg) == "WAIT") { int X, K; scanf("%*s%d%d", &X, &K); const int m = X; ms.push_back(m); if (!~total[m]) total[m] = K; assert(total[m] == K); } else { assert(false); } } { const int m0 = P[my][M - 1]; total[m0] = 3*N; for (int m = 1; m <= M; ++m) if (m0 != m) total[m0] -= total[m]; } const int your = lower_bound(P.begin(), P.end(), ms) - P.begin(); vector ans; // for (int m = 1; m <= M; ++m) freq[m] = total[m] - freq[m] - F[your][m]; vector Fyour; { int id = -1; doArraysWithSum(M, 0, N + 1, N, [&](const vector &fs) -> void { for (int m = 1; m <= M; ++m) if (fs[m - 1] > m) return; ++id; if (id == your) { Fyour = fs; Fyour.insert(Fyour.begin(), 0); } }); } for (int m = 1; m <= M; ++m) freq[m] = total[m] - freq[m] - Fyour[m]; // cerr<<"total = "<