func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 605;   int nask(vector<int> tmp) {     if (!tmp.size() || tmp.size() == 1) return 0;     cout <<  ?   << tmp.size() << endl;     for (int i = (0), iend = ((int)tmp.size() - 1); i <= iend; i++)       cout << tmp[i] <<    ;     cout << endl;     cout.flush();     int ans;     cin >> ans;     if (ans == -1) exit(0);     return ans;   }   int dask(int u, vector<int> tar) {     int cntsig = nask(tar);     tar.push_back(u);     int cnttot = nask(tar);     return cnttot - cntsig;   }   int n;   bool vis[maxn];   int bl[maxn];   int find(int u, vector<int> tmp) {     vector<int> c1, c2;     if (tmp.size() == 1) return tmp[0];     for (int i = (0), iend = ((int)(tmp.size()) - 1); i <= iend; i++) {       if (c1.size() < tmp.size() / 2)         c1.push_back(tmp[i]);       else         c2.push_back(tmp[i]);     }     if (dask(u, c1))       return find(u, c1);     else       return find(u, c2);   }   vector<int> half[2];   vector<int> side[maxn];   void dfs(int u) {     half[bl[u]].push_back(u);     while (1) {       vector<int> tmp;       for (int i = (1), iend = (n); i <= iend; i++)         if (!vis[i]) tmp.push_back(i);       if (dask(u, tmp) == 0) return;       int tar = find(u, tmp);       side[u].push_back(tar);       side[tar].push_back(u);       vis[tar] = 1;       bl[tar] = bl[u] ^ 1;       dfs(tar);     }   }   int stk[maxn], top;   vector<int> ans;   void cfs(int u, int tar) {     stk[++top] = u;     if (u == tar) {       for (int i = (1), iend = (top); i <= iend; i++) ans.push_back(stk[i]);       return;     }     for (int i = (0), iend = (side[u].size() - 1); i <= iend; i++) {       int v = side[u][i];       if (!vis[v]) {         vis[v] = 1;         cfs(v, tar);       }     }     top--;   }   void ans_out(int u, int v) {     memset(vis, 0, sizeof(vis));     vis[u] = 1;     cfs(u, v);     cout <<  N   << ans.size() << endl;     for (int i = (0), iend = ((int)(ans.size()) - 1); i <= iend; i++)       cout << ans[i] <<    ;     return;   }   int main() {     ios::sync_with_stdio(0);     cin >> n;     vis[1] = 1;     dfs(1);     if (!nask(half[0]) && !nask(half[1])) {       cout <<  Y   << half[0].size() << endl;       for (int i = (0), iend = ((int)(half[0].size()) - 1); i <= iend; i++)         cout << half[0][i] <<    ;       return 0;     } else {       for (int i = (0), iend = (1); i <= iend; i++)         for (int j = (0), jend = ((int)(half[i].size()) - 1); j <= jend; j++) {           vector<int> tmp;           int u = half[i][j];           for (int k = (0), kend = ((int)(half[i].size()) - 1); k <= kend; k++)             if (half[i][k] != u) tmp.push_back(half[i][k]);           if (dask(u, tmp)) {             for (int k = (0), kend = ((int)(tmp.size()) - 1); k <= kend; k++) {               vector<int> gg;               gg.push_back(u);               gg.push_back(tmp[k]);               if (nask(gg)) {                 ans_out(u, tmp[k]);                 return 0;               }             }           }         }     }   }   