#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <bitset>
#include <map>
#include <cassert>
#include <queue>
#define int long long
using namespace std;
vector<bool> send_packet(vector<bool> A);
int stat[40];
void send_message(vector<bool> M,vector<bool> C){
M.push_back(1);
while(M.size()!=1025){
M.push_back(0);
}
int lst=-1;
for(int i=0;i<31;i++){
if(!C[i]){
stat[i]=lst;
lst=i;
}
}
vector<bool> val[66];
for(int i=0;i<66;i++){
val[i]=vector<bool>(31,0);
}
int pos=0;
for(int i=0;i<31;i++){
if(!C[i]){
for(int j=0;j<66;j++){
int diff=i-((stat[i]==-1)?lst-31:stat[i])-1;
if(j==diff){
val[j][i]=1;
}else if(j>diff){
val[j][i]=M[pos++];
}
}
}
}
for(int i=0;i<66;i++){
send_packet(val[i]);
}
}
vector<bool> receive_message(vector<vector<bool> > R){
int nxt[40];
for(int i=0;i<31;i++){
nxt[i]=0;
for(int j=0;j<66;j++){
if(R[j][i]){
nxt[i]=(i-j+30)%31;
break;
}
}
nxt[i]=max(nxt[i],0ll);
}
// vector<bool> res;
// bool vis[40];
// for(int i=0;i<31;i++){
// int cur=i,siz=1;
// memset(vis,0,sizeof(vis));
// while(!vis[cur]){
// vis[cur]=1;
// siz++;
// cur=nxt[cur];
// }
// if(cur!=i){
// continue;
// }
// if(siz==16){
// vector<int> cont;
// cont.push_back(i);
// while(1){
// if(nxt[cont.back()]==i){
// break;
// }
// cont.push_back(nxt[cont.back()]);
// }
// sort(cont.begin(),cont.end());
// for(int j:cont){
// bool flg=0;
// for(int k=0;k<66;k++){
// if(flg){
// res.push_back(R[k][j]);
// }
// flg|=R[k][j];
// }
// }
// break;
// }
// }
// while(!res.back()){
// res.pop_back();
// }
// res.pop_back();
return res;
}