#include "message.h"
#include<bits/stdc++.h>
using namespace std;
using vb=vector<bool>;
void dbg(vector<int> a){
cerr<<"vb a =";
for(int i:a)cerr<<' '<<i;
cerr<<endl;
}
void dbg(vb a){
cerr<<"vb a =";
for(int i:a)cerr<<' '<<i;
cerr<<endl;
}
void send_message(vb M, vb C){
int n=ssize(M),m=ssize(C);
vector<int> c2;
for(int i=0;i<m;i++)if(!C[i])c2.push_back(i);
assert(ssize(c2)==16);
// dbg(c2);
for(int i=0;i<m;i++){
vb o;o.insert(begin(o),m,C[i]);
send_packet(o);
}
for(int i=0;i*16<=n;i++){
vb o(m);
for(int j=0;j<16;j++)if(i*16+j<n)o[c2[j]]=M[i*16+j];
send_packet(o);
}
vb o(m);
for(int i=0;i<16;i++)o[c2[i]]=(n>>i)&1;
send_packet(o);
}
vb receive_message(vector<vb> R){
int n=0,m=ssize(R[0]);
vector<int> c2;
for(int i=0;i<m;i++){
int s=accumulate(begin(R[i]),end(R[i]),0);
if(s<16)c2.push_back(i);
}
// dbg(c2);
assert(ssize(c2)==16);
vb o;
for(int i=m;i<ssize(R)-1;i++){
for(int j:c2)o.push_back(R[i][j]);
}
cerr<<"ssize(o)="<<ssize(o)<<'\n';
for(int i=15;~i;i--)(n*=2)+=R.back()[c2[i]];
o.resize(n);
return o;
}