#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 x0 = -1;
for (int i = 0; i < N; i++) {
if (S[i] == 'X') { x0 = i; break; }
}
if (x0 == -1) {
for (int i = 0; i < N; i++) Remove(i);
return;
}
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 = 0; i < x0; i++) do_remove(i);
int prefixEnd = x0;
bool seenX = true;
bool haveY = false;
int lastY = -1;
for (int i = x0 + 1; i < N; i++) {
if (S[i] == 'X') {
seenX = true;
} else if (S[i] == 'Y') {
if (seenX) {
haveY = true;
lastY = i;
}
} else {
if (haveY) {
for (int k = prefixEnd + 1; k <= i - 1; k++) {
if (k == lastY) continue;
do_remove(k);
}
do_remove(lastY);
do_remove(i);
prefixEnd = i;
haveY = false;
lastY = -1;
}
}
}
for (int i = prefixEnd + 1; i < N; i++) do_remove(i);
do_remove(x0);
for (int idx : order) Remove(idx);
}