#include "multi.h"
#include <iostream>
#include <vector>
#include <cassert>
#include <tuple>
#include <algorithm>
#include <set>
using namespace std;
using ull=unsigned long long;
using piu=pair<int, ull>;
using ti2u=tuple<int, int, ull>;
namespace
{
const ull inf64=(1ull<<48)-1;
const int MN=256;
int dsu[MN], par[MN];
ti2u opt[MN];
bool tkn[MN];
vector<int> g[MN];
int find(int x)
{
if (dsu[x]==x) return x;
else return dsu[x]=find(dsu[x]);
}
bool unite(int x, int y)
{
x=find(x); y=find(y);
if (x==y) return 0;
dsu[y]=x; return 1;
}
void dfs(int u)
{
//cerr<<u<<endl;
dsu[u]=par[u];
for (int v:g[u]) if (v!=par[u])
{
par[v]=u;
dfs(v);
}
}
}
vector<ull> strategy(int N, int R, int U, vector<ull> A, vector<ull> B)
{
//cerr<<"STRATEGY "<<N<<' '<<R<<' '<<U<<endl;
//cerr<<"A: "; for (ull i:A) cerr<<i<<' '; cerr<<endl;
//cerr<<"B: "; for (ull i:B) cerr<<i<<' '; cerr<<endl;
if (R==0)
{
piu edge={0, inf64};
for (int i=0; i<N; i++) if (i!=U) if (edge.second>A[i]) edge={i, A[i]};
ull val=0;
for (int i=0; i<8; i++) if ((U>>i)&1) val^=(1ull<<i);
for (int i=0; i<8; i++) if ((edge.first>>i)&1) val^=(1ull<<(8+i));
for (int i=0; i<48; i++) if ((edge.second>>i)&1) val^=(1ull<<(16+i));
vector<ull> vec(N, val);
//cerr<<edge.first<<' '<<edge.second<<endl;
return vec;
}
if (R==9)
{
ull ans=0;
for (int i=0; i<N; i++)
{
ull wgt=0;
for (int j=0; j<48; j++) if ((B[i]>>j)&1) wgt^=(1ull<<j);
ans+=wgt;
}
//cerr<<"! "<<ans<<endl;
return {ans};
}
for (int i=0; i<N; i++) g[i].clear();
for (int i=0; i<N; i++)
{
dsu[i]=0;
for (int j=0; j<8; j++) if ((B[i]>>j)&1) dsu[i]^=(1ull<<j);
if (dsu[i]!=i)
{
g[i].push_back(dsu[i]);
g[dsu[i]].push_back(i);
}
opt[i]={i, 0, 0};
for (int j=0; j<8; j++) if ((B[i]>>(8+j))&1) get<1>(opt[i])^=(1ull<<j);
for (int j=0; j<48; j++) if ((B[i]>>(16+j))&1) get<2>(opt[i])^=(1ull<<j);
//cerr<<i<<": "<<get<1>(opt[i])<<' '<<get<2>(opt[i])<<endl;
}
for (int i=0; i<N; i++)
{
if (get<2>(opt[find(i)])>get<2>(opt[i]))
{
opt[find(i)]=opt[i];
}
}
for (int i=0; i<N; i++)
{
if (dsu[i]==i)
{
auto [u, v, w]=opt[i];
if (w==inf64) continue;
assert(find(u)!=find(v));
g[u].push_back(v);
g[v].push_back(u);
//cerr<<u<<" AND "<<v<<endl;
assert(unite(u, v));
}
}
for (int i=0; i<N; i++)
{
if (dsu[i]==i)
{
par[i]=i;
dfs(i);
}
}
//for (int i=0; i<N; i++) cerr<<i<<": "<<par[i]<<endl;
vector<ull> vec;
if (R<8)
{
piu edge={0, inf64};
for (int i=0; i<N; i++)
{
if (find(i)!=find(U))
{
if (edge.second>A[i])
{
edge.first=i;
edge.second=A[i];
}
}
}
ull val=0;
for (int i=0; i<8; i++) if ((par[U]>>i)&1) val^=(1ull<<i);
for (int i=0; i<8; i++) if ((edge.first>>i)&1) val^=(1ull<<(8+i));
for (int i=0; i<48; i++) if ((edge.second>>i)&1) val^=(1ull<<(16+i));
vec=vector<ull>(N, val);
}
else
{
ull val=0;
for (int i=0; i<48; i++) if ((A[par[U]]>>i)&1) val^=(1ull<<i);
vec=vector<ull>(N, val);
}
return vec;
}