#include <bits/stdc++.h>   clock_t t = clock();   namespace my_std {   using namespace std;   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   template <typename T>   inline T rnd(T l, T r) {     return uniform_int_distribution<T>(l, r)(rng);   }   template <typename T>   inline bool chkmax(T &x, T y) {     return x < y ? x = y, 1 : 0;   }   template <typename T>   inline bool chkmin(T &x, T y) {     return x > y ? x = y, 1 : 0;   }   template <typename T>   inline void read(T &t) {     t = 0;     char f = 0, ch = getchar();     double d = 0.1;     while (ch >  9  || ch <  0 ) f |= (ch ==  - ), ch = getchar();     while (ch <=  9  && ch >=  0 ) t = t * 10 + ch - 48, ch = getchar();     if (ch ==  . ) {       ch = getchar();       while (ch <=  9  && ch >=  0 ) t += d * (ch ^ 48), d *= 0.1, ch = getchar();     }     t = (f ? -t : t);   }   template <typename T, typename... Args>   inline void read(T &t, Args &...args) {     read(t);     read(args...);   }   char __sr[1 << 21], __z[20];   int __C = -1, __zz = 0;   inline void Ot() { fwrite(__sr, 1, __C + 1, stdout), __C = -1; }   inline void print(register int x) {     if (__C > 1 << 20) Ot();     if (x < 0) __sr[++__C] =  - , x = -x;     while (__z[++__zz] = x % 10 + 48, x /= 10)       ;     while (__sr[++__C] = __z[__zz], --__zz)       ;     __sr[++__C] =   n ;   }   void file() {}   inline void chktime() {}   long long ksm(long long x, int y) {     long long ret = 1;     for (; y; y >>= 1, x = x * x)       if (y & 1) ret = ret * x;     return ret;   }   }  // namespace my_std   using namespace my_std;   int n, K;   vector<int> bl[30100];   int ok[30100];   struct hh {     int t, nxt;   } edge[30100];   int head[30100], ecnt;   void make_edge(int f, int t) {     edge[++ecnt] = (hh){t, head[f]};     head[f] = ecnt;   }   int vis[30100];   int pth[30100], c;   void dfs(int x) {     for (int &i = head[x], t; (t = i); i = edge[i].nxt)       if (!vis[i]) vis[i] = 1, dfs(edge[i].t), pth[++c] = edge[t].t;   }   int ask(int x) {     printf( ? %d n , x);     fflush(stdout);     char c;     cin >> c;     return c ==  Y ;   }   void add(int id, int flg) {     for (int i = (0); i <= (K - 1); i++) ok[bl[id][i]] &= !(flg & ask(bl[id][i]));   }   void add2(int id, int flg) {     int p = -1;     for (int i = (K - 1); i >= (0); i--)       if (ok[bl[id][i]]) p = i;     if (p == -1) {       for (int i = (0); i <= (K - 1); i++) ask(bl[id][i]);       return;     }     if (p == 0) {       for (int i = (0); i <= (K - 1); i++)         if (ok[bl[id][i]])           ok[bl[id][i]] &= !(flg & ask(bl[id][i]));         else           ask(bl[id][p]);     } else {       ok[bl[id][p]] &= !(flg & ask(bl[id][p]));       for (int i = (1); i <= (p); i++) ask(bl[id][p]);       for (int i = (p + 1); i <= (K - 1); i++)         if (ok[bl[id][i]])           ok[bl[id][i]] &= !(flg & ask(bl[id][i]));         else           ask(bl[id][p]);     }   }   void work(int t) {     int n = ::n / K;     for (int i = (1); i <= (n); i++)       for (int j = (i + 1); j <= (n); j++) make_edge(i, j);     for (int i = (1); i <= (n / 2); i++)       for (int j = (1); j <= (n - 2 * i + 1); j++) make_edge(n - i + 1, i);     dfs(1);     pth[++c] = 1;     reverse(pth + 1, pth + c + 1);     --c;     add(1, !t);     for (int i = (2); i <= (c); i++)       t ? add2(pth[i], pth[i] > pth[i - 1]) : add(pth[i], pth[i] > pth[i - 1]);     for (int i = (1); i <= (ecnt); i++) vis[i] = 0;     c = ecnt = 0;     for (int i = (1); i <= (n); i++) head[i] = 0;   }   int main() {     read(n, K);     for (int i = (1); i <= (n); i++) ok[i] = 1;     for (int i = (1); i <= (n / K); i++)       for (int j = ((i - 1) * K + 1); j <= (i * K); j++) bl[i].push_back(j);     work(0);     for (int i = (1); i <= (n / K); i++) reverse(bl[i].begin(), bl[i].end());     if (K != n) work(1);     int ans = 0;     for (int i = (1); i <= (n); i++) ans += ok[i];     printf( ! %d n , ans);     fflush(stdout);     return 0;   }