#include<bits/stdc++.h>
using namespace std;
#define pb push_back
vector<bool> receive_message(vector<vector<bool>> R){
//get C
int n=R.size();
vector<bool> C,cur(31,0);
vector<int> safe,add;
int f=0,it=0;
while(C.size()<31){
auto p=R[it++];
if(f==0){
int cnt0=0,cnt1=0;
for(auto u:p){
if(u) cnt1++;
else cnt0++;
}
if(cnt1>cnt0) C.pb(1);
else C.pb(0);
if(C.back()==0) safe.pb(C.size()-1);
if(safe.size()==2) f=1;
}else{
for(auto u:safe){
if(C.size()==31) break;
C.pb(p[u]);
if(!p[u]) add.pb(C.size()-1);
}
for(auto u:add) safe.pb(u);
add.clear();
}
}
//get M
vector<bool> ans;
for(int i=31;i<n-2;i++){
for(int j=0;j<31;j++){
if(!C[j]) ans.pb(R[i][j]);
}
}
int use=0;
for(int i=0;i<31;i++){
if(!C[i]&&R[n-2][i]) use++;
}
for(int i=0;i<31&&use>0;i++){
if(!C[i]){
ans.pb(R[n-1][i]);
use--;
}
}
return ans;
}
vector<bool> send_packet(vector<bool> A);
void send_message(vector<bool>M,vector<bool>C){
vector<int> safe;
int id=0;
vector<bool> cur(31,0);
vector<int> add;
int f=0;
for(int i=0;i<31;i++){
if(f==0){
vector<bool> v(31,C[i]);
send_packet(v);
if(!C[i]) safe.pb(i);
if(safe.size()==2) f=1;
}else{
cur[safe[id++]]=C[i];
if(!C[i]) add.pb(i);
if(id==safe.size()||i==30){
send_packet(cur);
cur.assign(31,0);
for (auto u:add) safe.pb(u);
id=0;
add.clear();
}
}
}
//send M
int n=M.size();
vector<bool> send(31);
int ind=0;
while(ind+16<n){
for(int i=0;i<31;i++){
if(!C[i]){
send[i]=M[ind];
ind++;
}
}
send_packet(send);
}
int tem=ind;
for(int i=0;i<31;i++){
if(!C[i]&&tem<M.size()){
send[i]=1;
tem++;
}else send[i]=0;
}
send_packet(send);
for(int i=0;i<31&&ind<M.size();i++){
if(!C[i]){
send[i]=M[ind];
ind++;
}
}
send_packet(send);
}