#include "message.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void send_message(std::vector<bool> M, std::vector<bool> C) {
for (int i=0 ; i<C.size() ; i++)
{
vector<bool>v(31, C[i]);
send_packet(v);
}
vector<bool>snd(31, 0);
ll id = 0;
ll ex = -1;
while (ex==-1)
{
for (int i=0 ;i<31 ; i++)
{
if (C[i]==1) continue;
snd[i] = M[id++];
if (id==M.size())
{
ex = i;
break;
}
}
send_packet(snd);
}
snd.assign(31, 0);
vector<ll>bit;
for (int i=0 ; i<31 ; i++)
{
if ((1<<i)&ex)
bit.push_back(1);
else
bit.push_back(0);
}
id = 0;
for (int i=0 ; i<31 ; i++)
{
if (C[i]==1) continue;
snd[i] = bit[id++];
}
send_packet(snd);
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
vector<bool>c;
for (int it=0 ; it<31 ; it++)
{
auto i = R[it];
ll cnt1=0, cnt0=0;
for (auto j:i)
{
if (j==0) cnt0++; else cnt1++;
}
c.push_back(((cnt0>cnt1)? 0:1));
}
ll end = 0;
auto it = R[R.size()-1];
ll j = 0;
for (int i=0 ; i<it.size() ; i++)
{
if (c[i]) continue;
end += (1<<j)*it[i];
j++;
}
vector<bool>res;
for (int it=31 ; it<R.size()-1 ; it++)
{
ll un = 30;
if (it==R.size()-2) un = end;
for (int i=0 ; i<=un ; i++)
{
if (c[i]) continue;
res.push_back(R[it][i]);
}
}
return res;
}