#include <bits/stdc++.h>
using namespace std;
int Query(const vector<int> &x);
void Answer(const vector<int> &a);
void Solve(int N, int M) {
const int thres = 420;
auto extract = [&](vector<int> &a) {
auto ac = a;
set<int> b;
auto query = [&]() {
vector<int> qv(b.begin(), b.end());
for (int &i : a) {
qv.push_back(i);
}
return Query(qv);
};
if (!query()) {
return false;
}
while (!a.empty()) {
int e = a.back();
a.pop_back();
if (query() == 0) {
b.insert(e);
}
}
Answer(vector<int>(b.begin(), b.end()));
for (int i = 0; i < ac.size(); ++i) {
if (!b.contains(ac[i])) {
a.push_back(ac[i]);
}
}
return true;
};
mt19937 gen(random_device{}());
auto recur = [&](auto &&self, vector<int> a) {
if (a.size() < thres) {
while (extract(a)) {}
return a;
}
const double mul = 0.8;
for (int _ = 0; _ < 100; ++_) {
shuffle(a.begin(), a.end(), gen);
vector<int> b(a.size() * mul);
copy(a.begin(), a.begin() + a.size() * mul, b.begin());
if (Query(b) != 0) {
b = self(self, b);
}
vector<int> aa;
for (int i = a.size() * mul; i < a.size(); ++i) {
aa.push_back(a[i]);
}
for (int &i : b) {
aa.push_back(i);
}
a = aa;
}
while (extract(a)) {}
return a;
};
vector<int> a(N * M);
iota(a.begin(), a.end(), 1);
shuffle(a.begin(), a.end(), gen);
recur(recur, a);
}