#include "message.h"
using namespace std;
void send_message(std::vector<bool> M, std::vector<bool> C) {
vector<int> my;
for (int i = 0 ; i < 31; i++){
if (C[i] == 0) my.push_back(i);
}
for (int i = 0; i < 5; i++){
vector<bool> v(31, 0);
int val = my[0] & (1<<i);
if (val != 0) val = 1;
for (auto el : my) v[el] = val;
send_packet(v);
}
int s = M.size();
vector<vector<bool>> le(67,vector<bool>(31, 0));
int cur = 0;
for (int i = 0; i < 67; i++){
if (i < 31){
le[i][my[0]] = C[i];
}
else if (i < 42){
int val = s & (1<<(i - 31));
if (val != 0) val = 1;
le[i][my[0]] = val;
}
int st = 0;
if (i < 42) st = 1;
for (int j = st; j < my.size(); j++){
le[i][my[j]] = M[cur];
cur++;
cur = min(cur, s - 1);
}
}
for (int i = 0; i < 67; i++){
send_packet(le[i]);
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> r){
vector<int> my;
int fop = 0;
for (int i = 0; i < 5; i++){
int c0 = 0, c1 = 0;
for (int j = 0; j < 31; j++){
if (r[i][j] == 0) c0++;
else c1++;
}
if (c1 > c0) fop += (1<<i);
}
for (int i = 5; i < 36; i++){
if (r[i][fop] == 0){
my.push_back(i - 5);
}
}
int s = 0;
for (int i = 36; i < 47; i++){
if (r[i][fop] == 1) s += (1<<(i - 36));
}
vector<bool> ans;
for (int i = 5; i < 72; i++){
int st = 0;
if (i < 47) st = 1;
for (int j = st; j < my.size(); j++){
if (ans.size() == s) break;
ans.push_back(r[i][my[j]]);
}
}
return ans;
}