#include <bits/stdc++.h>
using namespace std;
int query(vector<int> x, vector<int> y);
void answer(int a, int b);
bool solve(int N, int M) {
set<int> sink_cands, S;
for (int i = 0; i < N; ++i) {
sink_cands.insert(i), S.insert(i);
}
int found = 0;
vector<int> sinks;
while (!sink_cands.empty()) {
vector<int> cur_sinks;
while (!sink_cands.empty()) {
int u = *sink_cands.begin();
sink_cands.erase(sink_cands.begin());
vector<int> x(N), y(N);
for (int &i : sinks) {
x[i] = y[i] = 1;
}
x[u] = 1;
if (query(x, y) == 0) {
cur_sinks.push_back(u);
}
}
if (cur_sinks.empty()) {
return false;
}
for (int &i : cur_sinks) {
S.erase(i);
}
auto recur = [&](auto &&self, vector<int> S, int v) {
vector<int> x(N), y(N);
for (int &i : sinks) {
x[i] = y[i] = 1;
}
for (int &i : S) {
x[i] = y[i] = 1;
}
x[v] = 1;
if (query(x, y) != 1) {
return;
}
if (S.size() == 1) {
found++;
answer(S[0], v);
sink_cands.insert(S[0]);
return;
}
int n = S.size();
vector<int> S1(S.begin(), S.begin() + n / 2), S2(S.begin() + n / 2, S.end());
self(self, S1, v);
self(self, S2, v);
};
for (int &v : cur_sinks) {
recur(recur, vector<int>{S.begin(), S.end()}, v);
}
for (int &i : cur_sinks) {
sinks.push_back(i);
}
}
return found == M;
}