#include "encoder.h"
#include "encoderlib.h"
#include <set>
#include <bitset>
using namespace std;
using pii = pair<int,int>;
#define s second
#define f first
void encode(int N, int M[])
{
bitset<512> bs;
int cnt = 0;
for(int i{};i < N;i++){
for(int j{};j < 8;j++){
bs[i*8+j] = (M[i]>>j)&1;
cnt += bs[i*8+j];
}
}
int save = 0;
if(cnt > N*4){
send(0);
send(0);
send(0);
send(0);
save = 1;
}
for(int i{};i < N*8;i++){
if(bs[i] ^ save) send(i);
}
}
//2 bit position 1-4 -> 6 bit position
#include "decoder.h"
#include "decoderlib.h"
#include <bitset>
#include <iostream>
void decode(int N, int L, int X[])
{
std::bitset<512> ans;
int cnt = 0;
for(int i{};i < L;i++){
if(X[i] == 0) cnt++;
}
int val = 1;
if(cnt >= 4){
val = 0;
ans.set();
cnt = 4;
}
else cnt = 0;
for(int i{};i < L;i++){
if(X[i] == 0){
if(val == 0 && cnt--) continue;
else ans[X[i]] = val;
}
else ans[X[i]] = val;
}
//cout << ans << endl;
int cur = 0;
for(int i{};i <= N*8;i++){
if(i%8 == 0 && i != 0) output(cur),cur = 0;
cur += ans[i]<<(i%8);
//cout << cur << " -"<< endl;
}
}