#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e6 + 239;
const int MS = (1 << 16);
const int L = 31;
const int two = 2;
int n, a[M], k, p, id[M], s[two][M];
ll w[two][L];
int cur, pos[M];
inline bool cmp(int i, int j)
{
return (a[i] < a[j]);
}
inline ll merge_our(int c, int x, int y, int z)
{
int p1 = x;
int p2 = y;
int dl = y;
int pos = x - 1;
ll ans = 0;
while (p1 != y || p2 != z)
{
pos++;
if (p1 != y && (p2 == z || s[c][p1] < s[c][p2]))
{
ans += (ll)(p2 - dl);
s[1 - c][pos] = s[c][p1];
p1++;
}
else
{
s[1 - c][pos] = s[c][p2];
p2++;
}
}
return ans;
}
inline void init()
{
for (int i = 0; i < n; i++)
s[0][i] = id[i];
for (int t = 0; t < k; t++)
{
int ms = (1 << k) - (1 << (t + 1));
cur = 0;
for (int x = 1; x < n; x++)
{
if ((a[id[x - 1]] & ms) == (a[id[x]] & ms)) continue;
pos[cur] = x;
cur++;
}
pos[cur] = n;
cur++;
w[0][t] = 0;
w[1][t] = 0;
int ls = 0;
for (int i = 0; i < cur; i++)
{
int u = ls;
for (int x = ls; x < pos[i]; x++)
if (((a[id[x]] >> t) & 1) == 0)
u++;
ll nw = merge_our(t & 1, ls, u, pos[i]);
w[0][t] += nw;
w[1][t] += (ll)(pos[i] - u) * (ll)(u - ls) - nw;
ls = pos[i];
}
}
}
pair<ll, int> ar[two][MS];
int as, bs, eq[MS];
ll getkol(ll h)
{
ll ans = 0;
int r = 0;
while (r < (1 << bs))
{
if (ar[0][0].first + ar[1][r].first >= h) break;
r++;
}
for (int i = 0; i < (1 << as); i++)
{
ans += (ll)r;
if (i == (1 << as) - 1) continue;
while (r > 0)
{
if (ar[0][i + 1].first + ar[1][r - 1].first < h) break;
r--;
}
}
return ans;
}
int gett(ll h, int p)
{
for (int i = 0; i < (1 << bs); i++)
{
if (i == 0 || ar[1][i].first != ar[1][i - 1].first)
eq[i] = i;
else
eq[i] = eq[i - 1];
}
int r = 0;
while (r < (1 << bs))
{
if (ar[0][0].first + ar[1][r].first > h) break;
r++;
}
vector<pair<int, int> > ps;
for (int i = 0; i < (1 << as); i++)
{
if (r > 0 && ar[0][i].first + ar[1][r - 1].first == h) ps.push_back(make_pair(ar[0][i].second, r - eq[r - 1]));
if (i == (1 << as) - 1) continue;
while (r > 0)
{
if (ar[0][i + 1].first + ar[1][r - 1].first <= h) break;
r--;
}
}
sort(ps.begin(), ps.end());
for (pair<int, int> t : ps)
{
if (t.second > p)
{
ll W = 0;
for (int i = 0; i < (1 << as); i++)
if (ar[0][i].second == t.first)
{
W = ar[0][i].first;
break;
}
vector<int> st;
for (int i = 0; i < (1 << bs); i++)
if (ar[1][i].first == h - W)
st.push_back(ar[1][i].second);
sort(st.begin(), st.end());
return ((t.first << bs) | st[p]);
}
else
p -= t.second;
}
}
void solve()
{
cin >> n >> k >> p;
p--;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
id[i] = i;
sort(id, id + n, cmp);
init();
as = (k / 2);
bs = k - as;
for (int ms = 0; ms < (1 << as); ms++)
{
ll f = 0;
for (int x = 0; x < as; x++)
f += w[(ms >> x) & 1][bs + x];
ar[0][ms] = make_pair(f, ms);
}
for (int ms = 0; ms < (1 << bs); ms++)
{
ll f = 0;
for (int x = 0; x < bs; x++)
f += w[(ms >> x) & 1][x];
ar[1][ms] = make_pair(f, ms);
}
sort(ar[0], ar[0] + (1 << as));
sort(ar[1], ar[1] + (1 << bs));
ll l = 0;
ll r = (((ll)n * (ll)(n + 1)) / 2LL) + 1;
while (r - l > 1)
{
ll h = (l + r) >> 1;
if (getkol(h) <= p)
l = h;
else
r = h;
}
p -= getkol(l);
cout << gett(l, p) << "\n";
}
int main()
{
ios::sync_with_stdio(0);
int T;
cin >> T;
for (int z = 0; z < T; z++)
solve();
return 0;
}