#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 << 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);
while ((int)M.size() < 640) M.push_back(0);
auto check = [&](int s, int e, int d) -> int {
for (int i = 0; i < 8; i++) {
if (C[s+d*i] == 0) {
return i;
}
}
return -1;
};
int f1 = check(0, 30, +1);
int f2 = check(30, 0, -1);
auto encode = [&](int x, int d) { // d true - reversed
vector<bool> a(31);
a = vector<bool>(31, d == -1);
send_packet(a);
for (int i = 0; i < 3; i++) {
a = vector<bool>(31, (x&(1<<i)) != 0);
send_packet(a);
}
};
int f = f1;
if (f1 != -1) encode(f1, 0);
else f = 30-f2, encode(f2, 0);
vector<bool> a(31);
auto flush = [&]() -> void {
send_packet(a);
a = vector<bool>(31);
};
int x = 0;
int ai = 0;
vector<int> pos;
for (int i = 0; i < 31; i++) if (C[i] == 0) pos.push_back(i);
for (int i = 0; i < (int)M.size();) {
if (x == f) x++;
if (x < 31 && pos[ai] == f) {
a[pos[ai]] = C[x++];
}
else a[pos[ai]] = M[i++];
ai++;
if (ai == 16) flush(), ai = 0;
}
if (ai) flush();
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
auto readblob = [&](vector<bool> a) -> int {
int one = 0;
for (bool b : a) one += b;
return one >= 16;
};
int drev = readblob(R[0]);
int f = readblob(R[1])+readblob(R[2])*2+readblob(R[3])*4;
if (drev) f = 30-f;
vector<int> c(31, 1);
c[f] = 0;
for (int i = 0, id = 4; i < 31; i++) if (i != f) c[i] = R[id++][f];
vector<int> pos;
for (int i = 0; i < 31; i++) if (c[i] == 0) pos.push_back(i);
vector<bool> ans;
for (int id = 4, x = 0; id < (int)R.size(); id++, x++) {
for (int p : pos) if (p != f || x >= 30) ans.push_back(R[id][p]);
}
while (ans.back() == 0) ans.pop_back();
ans.pop_back();
return ans;
}