#include "message.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 1e9;
void send_packet_d(vector<bool> &a) { static int cnt = 1; cout << setw(2) << cnt++ << ": "; for (bool x : a) cout << x << " "; cout << endl; send_packet(a); }
void send_message(std::vector<bool> M, std::vector<bool> C) {
M.push_back(1);
vector<vector<bool>> a(66, vector<bool>(31));
vector<int> ds(31);
for (int i = 0; i < 31; i++) if (!C[i]) {
int d = 0;
for (int j = (i+1)%31; ; j = (j+1)%31, d++) if (!C[j]) break;
ds[i] = d;
a[d][i] = 1;
}
int id = 0;
for (int i = 0; i < 31; i++) if (!C[i]) {
for (int j = ds[i]+1; j < 66; j++) {
if (id >= (int)M.size()) break;
a[j][i] = M[id++];
}
}
for (int i = 0; i < 66; i++) send_packet(a[i]);
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> a) {
vector<int> c(31, 1), ds(31);
for (int i = 0; i < 31; i++) for (; ds[i] < 20 && !a[ds[i]][i]; ds[i]++);
bool ok = 0;
auto dfs = [&](auto dfs, int start, int u, int d, bool f = 0) -> void {
if (start == u && !f) {
if (d == 16) ok = 1;
return;
}
if (d > 16) return;
dfs(dfs, start, (u+ds[u]+1)%31, d+1);
};
for (int i = 0; i < 31; i++) {
dfs(dfs, i, i, 0, 1);
if (ok) {
int u = i;
for (int _ = 0; _ < 16; _++) c[u] = 0, u = (u+ds[u]+1)%31;
break;
}
}
vector<bool> ans;
for (int i = 0; i < 31; i++) if (!c[i]) {
for (int j = ds[i]+1; j < (int)a.size(); j++) {
ans.push_back(a[j][i]);
}
}
while (ans.back() == 0) ans.pop_back();
ans.pop_back();
return ans;
}