#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) {
ll cnt =0;
ll f = 0;
vector<ll>sv;
ll idd = 0;
vector<bool>go(31, 0);
vector<ll>oth;
for (int i=0 ; i<C.size() ; i++)
{
if (f==0)
{
vector<bool>v(31, C[i]);
send_packet(v);
if (!C[i]) sv.push_back(i);
if (sv.size()==2)
{
f = 1;
}
}
else
{
go[sv[idd++]] = C[i];
if (!C[i]) oth.push_back(i);
if (idd==sv.size() or i==C.size()-1){
send_packet(go);
go.assign(31, 0);
for (auto k:oth) sv.push_back(k);
idd = 0;
oth.clear();
}
}
}
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;
ll f = 0;
vector<ll>sv;
ll id = 0;
vector<bool>go(31, 0);
vector<ll>oth;
ll lst = -1;
for (int it=0 ; c.size()<31; it++)
{
lst = it;
if (f==0)
{
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));
if (c[c.size()-1]==0)
sv.push_back(c.size()-1);
if (sv.size()==2)
f = 1;
}
else
{
ll cn = 1;
for (auto j:sv)
{
if (c.size()==31) break;
c.push_back(R[it][j]);
if (!R[it][j])
oth.push_back(c.size()-1);
}
for (auto j:oth) sv.push_back(j);
oth.clear();
}
}
// for (int j=0 ; j<31 ; j++) cout<<c[j]<<" ";
// cout<<endl;
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=lst+1 ; 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]);
}
}
// for (auto i:res) cout<<i<<" ";
return res;
}