#include "voltage.h"
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
bool solve(int N, int M) {
queue<int> que;
vector<int> rem(N);
for (int i = 0; i < N; ++i) rem[i] = i;
vector<int> used;
auto indeg_0 = [&](int v) {
vector<int> A(N, 1), B(N, 1);
for (int i : used) A[i] = B[i] = 0;
A[v] = 1; B[v] = 0;
if (query(A, B) == 0) {
que.push(v);
rem.erase(find(rem.begin(), rem.end(), v));
}
};
for (int i = 0; i < N; ++i) indeg_0(i);
while (!que.empty()) {
int v = que.front(); que.pop();
vector<int> us;
while (1) {
{
vector<int> A(N, 1), B(N, 1);
for (int i : used) A[i] = B[i] = 0;
for (int i : rem) A[i] = B[i] = 0;
for (int i : us) A[i] = B[i] = 1;
A[v] = 1; B[v] = 0;
if (query(A, B) == 0) break;
}
int ok = 0, ng = rem.size() + 1;
while (ng - ok > 1) {
int mid = (ok + ng) / 2;
vector<int> A(N, 1), B(N, 1);
for (int i : used) A[i] = B[i] = 0;
for (int i = ok; i < mid; ++i) A[rem[i]] = B[rem[i]] = 0;
for (int i : us) A[i] = B[i] = 1;
A[v] = 1; B[v] = 0;
if (query(A, B) == 0) ok = mid;
else ng = mid;
}
us.push_back(rem[ok]);
}
used.push_back(v);
for (int u : us) {
answer(v, u);
indeg_0(u);
}
}
return used.size() == N;
}