#include #include using namespace std; const int inf = 0x3f3f3f3f, kMaxN = 1005, kMaxK = 15; int dp[kMaxN][kMaxK]; void getMin(int &a, int b) { if (a > b) a = b; } void makeDp(int n, int k) { for (int i = 1; i <= n; ++i) { dp[i][1] = i; } for (int j = 2; j <= k; ++j) { for (int i = 1; i <= n; ++i) { dp[i][j] = inf; for (int l = 1; l <= i; ++l) { getMin(dp[i][j], max(dp[i - l][j], dp[l - 1][j - 1]) + 1); } } } } int getMove(int n, int k) { if (k == 1) return 1; for (int i = 1; i <= n; ++i) if (dp[n][k] == max(dp[n - i][k], dp[i - 1][k - 1]) + 1) return i; cerr << "ERROR\n"; return -1; } int main() { // cerr << "A inceput prog\n"; int n, k, start = 0, lastGood = 0; cin >> n >> k; n--; makeDp(n, k); // for (int j = 1; j <= k; ++j) { // for (int i = 1; i <= n; ++i) // cerr << dp[i][j] << '\t'; // cerr << '\n'; // } // cerr << "!!!\n"; while (1) { int q = 0; if (n == 0) { cout << "answer\n"; cout << lastGood + 1 << '\n'; cout.flush(); } else { q = getMove(n, k); cout << "query\n"; cout << q + start << '\n'; cout.flush(); } string response; cin >> response; if (response == "broke") { k--; n = q - 1; } else { n -= q; start += q; lastGood = start; } if (response == "error") { // cerr << "PANICA"; } if (response == "exit") break; } return 0; }