#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
using namespace std;
#define ll int
ll PW(ll a, ll p){
ll res = 1;
for (ll i = 0; i < p; i++)res *= a;
return res;
}
void encode(int N, int M[]){
// int i;
// map<int, int>mp;
// for(i=0; i<N; i++)
// mp[M[i]]++;
// vector<array<int, 2>>v;
// for(auto [x, frq]: mp)
// v.push_back({frq, x});
// sort(v.begin(), v.end());
// for(auto [frq, x]: v)
// send(x);
if (N <= 32){
ll valId[N][9];
ll id = 0;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < 8; j++)
valId[i][j] = id++;
}
// cout << "Message" << endl;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < 8; j++)
for (ll k = 0; k < (M[i] >> j & 1); k++){
// cout << valId[i][j] << ' ';
// cout << endl;
send(valId[i][j]);
}
}
return ;
}
ll valId[N][9], LEN = 4, B = 4;
ll id = 0;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < LEN; j++)
valId[i][j] = id++;
}
ll cnt = 0;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < LEN; j++){
ll V = PW(B, j);
cnt += ((M[i] / V) % B);
}
}
bool done = 0;
if (cnt > 6 * N){
done = 1;
for(ll _ = 0; _ < 5; _++)
send(0);
}
// cout << "Message" << endl;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < LEN; j++){
ll V = PW(B, j), limit = (done?(B - ((M[i] / V) % B)) % B: ((M[i] / V) % B));
for (ll k = 0; k < limit; k++){
// cout << valId[i][j] << ' ';
// cout << endl;
send(valId[i][j]);
}
}
}
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;
#define ll int
ll PWW(ll a, ll p){
ll res = 1;
for (ll i = 0; i < p; i++)res *= a;
return res;
}
void decode(int N, int L, int X[])
{
// int i, b;
// for(i=0; i<L; i++) {
// b = X[i];
// for(int j = 0; j <= i; j++)
// output(b);
// }
if (N <= 32){
ll valId[N][9], frq[300]{};
ll id = 0;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < 8; j++)
valId[i][j] = id++;
}
for (ll i = 0; i < L; i++)frq[X[i]]++;
// cout << "freq" << endl;
// for (ll i = 0; i < 24; i++)
// cout << i << " = " << frq[i] << endl;
for (ll i = 0; i < N; i++){
ll val = 0;
for (ll j = 0; j < 8; j++)
if(frq[valId[i][j]] == 1)val |= (1 << j);
// cout << val << ' ';
// cout << endl;
output(val);
}
return ;
}
ll valId[N][9], frq[300]{}, LEN = 4, B = 4;
ll id = 0;
for (ll i = 0; i < N; i++){
for (ll j = 0; j < LEN; j++)
valId[i][j] = id++;
}
for (ll i = 0; i < L; i++)frq[X[i]]++;
bool done = (frq[0] >= 4);
if(frq[0] >= 4)frq[0] -= 4;
// cout << "freq" << endl;
// for (ll i = 0; i < 24; i++)
// cout << i << " = " << frq[i] << endl;
for (ll i = 0; i < N; i++){
ll val = 0;
for (ll j = 0; j < LEN; j++){
ll V = PWW(B, j), limit = (done? (B - frq[valId[i][j]]) % B: frq[valId[i][j]]);
val += V * limit;
}
// cout << val << ' ';
// cout << endl;
output(val);
}
}