| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| int main() { |
| int sub, n; |
| scanf("%d %d", &sub, &n); |
| int f_b = min(100, n / 10); |
| if (n <= 10) f_b = 1; |
| vector<vector<int>> adj(n + 1); |
| set<int> remaining_set; |
| for (int i = 1; i <= n; ++i) remaining_set.insert(i); |
| |
| vector<int> B; |
| vector<int> candidates(n); |
| for (int i = 0; i < n; ++i) candidates[i] = i + 1; |
| for (int lab : candidates) { |
| printf("1 %d\n", lab); |
| fflush(stdout); |
| int res; |
| scanf("%d", &res); |
| if (res == 0) { |
| B.push_back(lab); |
| if ((int)B.size() == f_b) break; |
| } else { |
| printf("1 %d\n", lab); |
| fflush(stdout); |
| int res2; |
| scanf("%d", &res2); |
| } |
| } |
| |
| |
| vector<bool> in_B(n + 1, false); |
| for (int b : B) in_B[b] = true; |
| vector<int> rem_vec; |
| for (int i = 1; i <= n; ++i) { |
| if (!in_B[i]) { |
| rem_vec.push_back(i); |
| remaining_set.erase(i); |
| } |
| } |
| |
| int r_size = rem_vec.size(); |
| int Lbatch = 2 * r_size; |
| printf("%d", Lbatch); |
| for (int u : rem_vec) { |
| printf(" %d %d", u, u); |
| } |
| printf("\n"); |
| fflush(stdout); |
| vector<int> resbatch(Lbatch); |
| for (int i = 0; i < Lbatch; ++i) { |
| scanf("%d", &resbatch[i]); |
| } |
| vector<int> Next; |
| for (int j = 0; j < r_size; ++j) { |
| int idx = 2 * j + 1; |
| if (resbatch[idx] == 1) { |
| Next.push_back(rem_vec[j]); |
| } |
| } |
| |
| int Lb = B.size(); |
| if (Lb > 0) { |
| printf("%d", Lb); |
| for (int b : B) printf(" %d", b); |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < Lb; ++i) { |
| int dummy; |
| scanf("%d", &dummy); |
| } |
| } |
| |
| |
| for (int b : B) { |
| |
| printf("1 %d\n", b); |
| fflush(stdout); |
| int res0; |
| scanf("%d", &res0); |
| |
| int Ln = 2 * Next.size(); |
| printf("%d", Ln); |
| for (int u : Next) { |
| printf(" %d %d", u, u); |
| } |
| printf("\n"); |
| fflush(stdout); |
| vector<int> resn(Ln); |
| for (int i = 0; i < Ln; ++i) { |
| scanf("%d", &resn[i]); |
| } |
| |
| for (size_t j = 0; j < Next.size(); ++j) { |
| int idx = 2 * j + 1; |
| if (resn[idx] == 1) { |
| int u = Next[j]; |
| adj[b].push_back(u); |
| adj[u].push_back(b); |
| } |
| } |
| |
| printf("1 %d\n", b); |
| fflush(stdout); |
| int res1; |
| scanf("%d", &res1); |
| } |
| |
| vector<int> potential_F; |
| for (int i = 1; i <= n; ++i) { |
| if ((int)adj[i].size() == 1) potential_F.push_back(i); |
| } |
| |
| int pf_size = potential_F.size(); |
| for (int ee = 0; ee < pf_size; ++ee) { |
| int e = potential_F[ee]; |
| |
| printf("1 %d\n", e); |
| fflush(stdout); |
| int res0; |
| scanf("%d", &res0); |
| |
| vector<int> others; |
| for (int jj = 0; jj < pf_size; ++jj) { |
| if (jj != ee) others.push_back(potential_F[jj]); |
| } |
| int Lo = 2 * others.size(); |
| printf("%d", Lo); |
| for (int o : others) { |
| printf(" %d %d", o, o); |
| } |
| printf("\n"); |
| fflush(stdout); |
| vector<int> reso(Lo); |
| for (int i = 0; i < Lo; ++i) { |
| scanf("%d", &reso[i]); |
| } |
| |
| for (size_t j = 0; j < others.size(); ++j) { |
| int idx = 2 * j + 1; |
| if (reso[idx] == 1) { |
| int o = others[j]; |
| bool has = false; |
| for (int nb : adj[e]) { |
| if (nb == o) has = true; |
| } |
| if (!has) { |
| adj[e].push_back(o); |
| adj[o].push_back(e); |
| } |
| } |
| } |
| |
| printf("1 %d\n", e); |
| fflush(stdout); |
| int resr; |
| scanf("%d", &resr); |
| } |
| |
| while (!remaining_set.empty()) { |
| |
| vector<int> current_F; |
| for (int i = 1; i <= n; ++i) { |
| if ((int)adj[i].size() == 1) current_F.push_back(i); |
| } |
| |
| int cf_size = current_F.size(); |
| for (int ee = 0; ee < cf_size; ++ee) { |
| int e = current_F[ee]; |
| |
| printf("1 %d\n", e); |
| fflush(stdout); |
| int res0; |
| scanf("%d", &res0); |
| |
| vector<int> others; |
| for (int jj = 0; jj < cf_size; ++jj) { |
| if (jj != ee) others.push_back(current_F[jj]); |
| } |
| int Lo = 2 * others.size(); |
| printf("%d", Lo); |
| for (int o : others) { |
| printf(" %d %d", o, o); |
| } |
| printf("\n"); |
| fflush(stdout); |
| vector<int> reso(Lo); |
| for (int i = 0; i < Lo; ++i) { |
| scanf("%d", &reso[i]); |
| } |
| |
| for (size_t j = 0; j < others.size(); ++j) { |
| int idx = 2 * j + 1; |
| if (reso[idx] == 1) { |
| int o = others[j]; |
| bool has = false; |
| for (int nb : adj[e]) { |
| if (nb == o) has = true; |
| } |
| if (!has) { |
| adj[e].push_back(o); |
| adj[o].push_back(e); |
| } |
| } |
| } |
| |
| printf("1 %d\n", e); |
| fflush(stdout); |
| int resr; |
| scanf("%d", &resr); |
| } |
| |
| current_F.clear(); |
| for (int i = 1; i <= n; ++i) { |
| if ((int)adj[i].size() == 1) current_F.push_back(i); |
| } |
| int g_size = current_F.size(); |
| |
| if (g_size > 0) { |
| printf("%d", g_size); |
| for (int g : current_F) printf(" %d", g); |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < g_size; ++i) { |
| int dummy; |
| scanf("%d", &dummy); |
| } |
| } |
| |
| |
| rem_vec.assign(remaining_set.begin(), remaining_set.end()); |
| r_size = rem_vec.size(); |
| Lbatch = 2 * r_size; |
| if (r_size > 0) { |
| printf("%d", Lbatch); |
| for (int u : rem_vec) { |
| printf(" %d %d", u, u); |
| } |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < Lbatch; ++i) { |
| int rb; |
| scanf("%d", &rb); |
| resbatch[i] = rb; |
| } |
| |
| Next.clear(); |
| for (int j = 0; j < r_size; ++j) { |
| int idx = 2 * j + 1; |
| if (resbatch[idx] == 1) { |
| int u = rem_vec[j]; |
| Next.push_back(u); |
| remaining_set.erase(u); |
| } |
| } |
| } else { |
| Next.clear(); |
| } |
| |
| |
| int n_size = Next.size(); |
| for (int gg = 0; gg < g_size; ++gg) { |
| int g = current_F[gg]; |
| |
| vector<int> to_off; |
| for (int jj = 0; jj < g_size; ++jj) { |
| if (jj != gg) to_off.push_back(current_F[jj]); |
| } |
| int Loff = to_off.size(); |
| if (Loff > 0) { |
| printf("%d", Loff); |
| for (int oo : to_off) printf(" %d", oo); |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < Loff; ++i) { |
| int dummy; |
| scanf("%d", &dummy); |
| } |
| } |
| |
| |
| int Ln = 2 * n_size; |
| printf("%d", Ln); |
| for (int u : Next) { |
| printf(" %d %d", u, u); |
| } |
| printf("\n"); |
| fflush(stdout); |
| vector<int> resn(Ln); |
| for (int i = 0; i < Ln; ++i) { |
| scanf("%d", &resn[i]); |
| } |
| |
| for (size_t j = 0; j < Next.size(); ++j) { |
| int idx = 2 * j + 1; |
| if (resn[idx] == 1) { |
| int u = Next[j]; |
| bool has = false; |
| for (int nb : adj[g]) { |
| if (nb == u) has = true; |
| } |
| if (!has) { |
| adj[g].push_back(u); |
| adj[u].push_back(g); |
| } |
| } |
| } |
| |
| if (Loff > 0) { |
| printf("%d", Loff); |
| for (int oo : to_off) printf(" %d", oo); |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < Loff; ++i) { |
| int dummy; |
| scanf("%d", &dummy); |
| } |
| } |
| |
| } |
| |
| if (g_size > 0) { |
| printf("%d", g_size); |
| for (int g : current_F) printf(" %d", g); |
| printf("\n"); |
| fflush(stdout); |
| for (int i = 0; i < g_size; ++i) { |
| int dummy; |
| scanf("%d", &dummy); |
| } |
| } |
| |
| } |
| |
| vector<int> perm; |
| int start = 1; |
| int curr = start; |
| int prevv = 0; |
| set<int> visited; |
| do { |
| perm.push_back(curr); |
| visited.insert(curr); |
| int nextt = -1; |
| for (int nb : adj[curr]) { |
| if (nb != prevv) { |
| nextt = nb; |
| break; |
| } |
| } |
| prevv = curr; |
| curr = nextt; |
| if (curr == 0) break; |
| } while (curr != start); |
| |
| |
| printf("-1"); |
| for (int p : perm) { |
| printf(" %d", p); |
| } |
| printf("\n"); |
| fflush(stdout); |
| return 0; |
| } |