#include <bits/stdc++.h>
#include "message.h"
using namespace std;
// std::vector<bool> send_packet(std::vector<bool> A)
//de aplicat o permuatre random sau ceva la inceput
//ar trebui sa micsoreze numarul de mesaje trimise cu gen 10
void send_message(vector<bool> M, vector<bool> C) {
vector<vector<bool>> trim(66, vector<bool>(31));
vector<int> bune;
for (int i = 0; i < 31; i ++) {
if (!C[i]) {
bune.push_back(i);
}
}
int mx = 0;
bune.push_back(bune[0] + 31);
for (int i = 0; i < 16; i ++) {
trim[bune[i + 1] - bune[i] - 1][bune[i]] = 1;
mx = max(mx, bune[i + 1] - bune[i]);
}
vector<int> nxt(31, 0);
for (int i = 0; i < (int)bune.size() - 1; i ++) {
nxt[bune[i]] = bune[i + 1];
}
int pm = 0;
for (int i = 0; i < 65; i ++) {
for (int j = 0; j < 31; j ++) {
if (!C[j] && nxt[j] - j <= i) {
if (pm < (int)M.size()) {
trim[i][j] = M[pm];
} else if (pm == (int)M.size()) {
trim[i][j] = 1;
} else {
trim[i][j] = 0;
}
pm ++;
}
}
}
for (auto i : trim) {
send_packet(i);
}
}
vector<bool> receive_message(vector<vector<bool>> R) {
vector<int> nxt(31, 0);
for (int i = 0; i < 31; i ++) {
for (int j = 0; j < 20; j ++) {
if (R[j][i] == 1) {
nxt[i] = (i + j + 1) % 31;
break;
}
}
}
vector<int> bune;
for (int i = 0; i < 31; i ++) {
vector<int> v;
vector<bool> viz(31, 0);
int loc = nxt[i];
v.push_back(i);
viz[i] = 1;
while (!viz[loc]) {
v.push_back(loc);
viz[loc] = 1;
loc = nxt[loc];
}
if (v.size() == 16) {
bune = v;
break;
}
}
sort(bune.begin(), bune.end());
vector<int> C(31, 1);
for (auto i : bune) {
C[i] = 0;
}
bune.push_back(bune[0] + 31);
nxt.assign(31, 0);
for (int i = 0; i < (int)bune.size() - 1; i ++) {
nxt[bune[i]] = bune[i + 1];
}
vector<bool> ans;
bool ok = false;
for (int i = 65; i >= 0; i --) {
for (int j = 30; j >= 0; j --) {
if (!C[j] && nxt[j] - j <= i) {
if (!ok && R[i][j] == 1) {
ok = true;
} else if (ok) {
ans.push_back(R[i][j]);
}
}
}
}
reverse(ans.begin(), ans.end());
return ans;
}