#include "Annalib.h"
#include <iostream>
#include <cassert>
#include <chrono>
#include <random>
#include <algorithm>
using namespace std;
using ll=long long;
void Set(int pos, int bit);
namespace encode
{
mt19937_64 rng(813045676191523084);
ll FR; int perm[38]; bool gen=0;
int work[150], b3[38];
void Anna(int N, ll X, int K, int P[])
{
if (!gen)
{
FR=(rng()&((1ll<<60)-1)); cerr<<FR<<endl;
for (int i=0; i<38; i++) perm[i]=i;
shuffle(perm, perm+38, rng);
for (int i=0; i<38; i++) cerr<<perm[i]<<' '; cerr<<endl;
gen=1;
}
X^=FR;
//cerr<<X<<' ';
for (int i=0; i<150; i++) work[i]=1;
for (int i=0; i<K; i++) work[P[i]]=0;
for (int i=0; i<38; i++)
{
b3[i]=X%3;
X/=3;
}
int cnt=0;
for (int i=0; i<150; i+=2)
{
bool f=1;
if (cnt==38) f=0;
else if (b3[perm[cnt]]==0 && !work[i+1]) f=0;
else if (b3[perm[cnt]]==1 && !work[i]) f=0;
else if (b3[perm[cnt]]==2 && (!work[i] || !work[i+1])) f=0;
if (f)
{
if (b3[perm[cnt]]==0)
{
Set(i, 0);
Set(i+1, 1);
}
else if (b3[perm[cnt]]==1)
{
Set(i, 1);
Set(i+1, 0);
}
else
{
Set(i, 1);
Set(i+1, 1);
}
cnt++;
}
else
{
Set(i, 0);
Set(i+1, 0);
}
}
//assert(cnt==38);
}
}
void Anna(int N, ll X, int K, int P[]) { encode::Anna(N, X, K, P); }
#include "Brunolib.h"
#include <iostream>
#include <cassert>
#include <chrono>
#include <random>
#include <algorithm>
using namespace std;
using ll=long long;
namespace decode
{
mt19937_64 rng(813045676191523084);
ll FR, p3[38]; int perm[38]; bool gen=0;
ll Bruno(int N, int A[])
{
if (!gen)
{
FR=(rng()&((1ll<<60)-1)); cerr<<FR<<endl;
p3[0]=1;
for (int i=1; i<38; i++) p3[i]=p3[i-1]*3;
for (int i=0; i<38; i++) perm[i]=i;
shuffle(perm, perm+38, rng);
for (int i=0; i<38; i++) cerr<<perm[i]<<' '; cerr<<endl;
gen=1;
}
int cnt=0; ll ans=0;
for (int i=0; i<150; i+=2)
{
if (!A[i] && !A[i+1]) continue;
assert(cnt<38);
if (A[i] && !A[i+1]) ans+=p3[perm[cnt]];
else if (A[i] && A[i+1]) ans+=p3[perm[cnt]]*2;
cnt++;
}
//cerr<<ans<<endl;
return ans^FR;
}
}
ll Bruno(int N, int A[]) { return decode::Bruno(N, A); }