#include "bits/stdc++.h"
using namespace std;
#include "message.h"
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
void send_message(vector<bool> m, vector<bool> c) {
vector<vector<bool>> pkg(66, vector<bool>(31, 0));
bool x = m.back() ^ 1;
while ((int)m.size() < 1025) m.push_back(x);
for (int i = 0; i < 31; ++i) {
if (c[i]) continue;
int cnt = 1;
int nxt = (i + 1) % 31;
while (c[nxt]) {
++cnt;
nxt = (nxt + 1) % 31;
}
for (int j = 0; j < cnt - 1; ++j) pkg[j][i] = 0;
pkg[cnt - 1][i] = 1;
}
vector<bool> free(31);
int ptr = 0;
for (int i = 0; i < 66; ++i) {
for (int j = 0; j < 31; ++j) {
if (pkg[i][j]) {
free[j] = 1;
continue;
}
if (free[j]) {
if (ptr < 1025) {
pkg[i][j] = m[ptr++];
}
}
}
}
for (int i = 0; i < 66; ++i) {
send_packet(pkg[i]);
}
}
vector<bool> receive_message(vector<vector<bool>> pkg) {
vector<int> nxt(31, -1);
for (int j = 0; j < 31; ++j) {
nxt[j] = j;
for (int i = 0; i < 66; ++i) {
if (pkg[i][j]) {
nxt[j] = (j + i + 1) % 31;
break;
}
}
}
int vx = -1;
vector<bool> vis(31);
for (int i = 0; i < 31; ++i) {
if (vis[i]) continue;
int cc = 0;
int cur = i;
while (true) {
++cc;
vis[cur] = 1;
if (vis[nxt[cur]]) break;
cur = nxt[cur];
}
if (cc == 16) {
vx = i;
break;
}
}
vis = vector<bool>(31, 0);
vector<int> cd;
while (true) {
cd.push_back(vx);
vis[vx] = 1;
if (vis[nxt[vx]]) break;
vx = nxt[vx];
}
sort(cd.begin(), cd.end());
vector<bool> free(31);
vector<bool> res;
for (int i = 0; i < 66; ++i) {
for (int j = 0; j < 31; ++j) {
if (!vis[j]) continue;
if (pkg[i][j]) {
free[j] = 1;
continue;
}
if (free[j]) {
if ((int)res.size() < 1025) {
res.push_back(pkg[i][j]);
}
}
}
}
bool x = res.back();
while (res.back() == x) res.pop_back();
return res;
}