#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;
{
int p=-1;
int cnt=0;
while(cnt<15) {
vb o(m);
if(ssize(c2)==0){
p++;
o.assign(m,C[p]);
if(C[p])cnt++;
if(!C[p])c2.push_back(p);
} else {
for(int i=0;i<ssize(c2)&&cnt<15;i++){
p++;
o[c2[i]]=C[p];
if(C[p])cnt++;
if(!C[p])c2.push_back(p);
}
}
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;
int ri=0;
{
int p=-1;
int cnt=0;
while(cnt<15) {
vb o=R[ri++];
if(ssize(c2)==0){
p++;
int s=accumulate(begin(o),end(o),0);
if(s>=16)cnt++;
else c2.push_back(p);
} else {
for(int i=0;i<ssize(c2)&&cnt<15;i++){
p++;
if(o[c2[i]])cnt++;
else c2.push_back(p);
}
}
}
for(int i=p+1;i<m;i++)c2.push_back(i);
}
// dbg(c2);
assert(ssize(c2)==16);
vb o;
for(int i=ri;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;
}