#include "Anna.h"
#include <vector>
namespace {
int enc(char c) {
if (c == 'X') return 0;
if (c == 'Y') return 1;
return 2;
}
}
void Anna(int N, std::vector<char> S) {
for (int i = 0; i < N; i++) {
int v = enc(S[i]);
Send(v & 1);
Send((v >> 1) & 1);
}
}
#include "Bruno.h"
#include <vector>
namespace {
int dec(int b0, int b1) { return b0 | (b1 << 1); }
}
void Bruno(int N, int L, std::vector<int> A) {
std::vector<char> S(N);
for (int i = 0; i < N; i++) {
int v = dec(A[2*i], A[2*i + 1]);
if (v == 0) S[i] = 'X';
else if (v == 1) S[i] = 'Y';
else S[i] = 'Z';
}
int z0 = -1;
for (int i = N - 1; i >= 0; i--) {
if (S[i] == 'Z') { z0 = i; break; }
}
if (z0 == -1) {
for (int i = 0; i < N; i++) Remove(i);
return;
}
std::vector<std::pair<int,int>> pairs;
pairs.reserve(N);
bool needX = true;
int curX = -1;
for (int i = 0; i < z0; i++) {
if (needX) {
if (S[i] == 'X') { curX = i; needX = false; }
} else {
if (S[i] == 'Y') { pairs.push_back({curX, i}); needX = true; }
}
}
std::vector<char> removed(N, 0);
std::vector<int> order;
order.reserve(N);
auto do_remove = [&](int idx) {
if (!removed[idx]) {
removed[idx] = 1;
order.push_back(idx);
}
};
for (int i = z0 + 1; i < N; i++) do_remove(i);
int rightCleared = z0;
for (int p = (int)pairs.size() - 1; p >= 0; p--) {
int x = pairs[p].first;
int y = pairs[p].second;
for (int k = y + 1; k < rightCleared; k++) do_remove(k);
rightCleared = y;
for (int k = x + 1; k < y; k++) do_remove(k);
do_remove(y);
do_remove(x);
}
for (int i = 0; i < N; i++) {
if (i == z0) continue;
do_remove(i);
}
do_remove(z0);
for (int idx : order) Remove(idx);
}