%%hzwer:http://hzwer.com/3657.html
好可怕,暴力大法好
什么可持久化字典树,蒟蒻不会
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
int n,K;
int num[100005];
int a[35][100005];ll cnt[35];
int b[2000005],pnt;
inline void solve1()
{
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
b[++pnt]=num[i]^num[j];
sort(b+1,b+pnt+1);
for (int i=1;i<=K;i++)
printf("%d ",b[i]);
}
inline void divi(int l,int r,int k)
{
cnt[k+1]+=(ll)(r-l+1)*(r-l)/2;
if (l>=r) return;
int t=l,mid;
for (int i=l;i<=r;i++)
if (a[k+1][i]&(1<<k))
a[k][t++]=a[k+1][i];
mid=t-1;
for (int i=l;i<=r;i++)
if (~a[k+1][i]&(1<<k))
a[k][t++]=a[k+1][i];
if (k!=0)
divi(l,mid,k-1),divi(mid+1,r,k-1);
}
inline void print(int l,int r,int k,int x)
{
if (l>=r) return;
if (x==k)
{
for (int i=l;i<=r;i++)
for (int j=i+1;j<=r;j++)
b[++pnt]=a[k][i]^a[k][j];
return;
}
int mid=l;
for (mid=l;mid<=r;mid++)
if (~a[k][mid]&(1<<k))
break;
mid--;
if (k!=0)
print(l,mid,k-1,x),print(mid+1,r,k-1,x);
}
inline void solve2()
{
for (int i=1;i<=n;i++) a[31][i]=num[i];
divi(1,n,30);
for (int i=31;i>=0;i--)
if (cnt[i]<K)
{
print(1,n,31,i+1); break;
}
sort(b+1,b+pnt+1);
for (int i=1;i<=K;i++)
printf("%d ",b[i]);
}
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(K);
for (int i=1;i<=n;i++)
read(num[i]);
if (n<=1000)
solve1();
else
solve2();
}
UPD:用可持久化字典树和超级钢琴的堆做法 懒得打了