
目前已知query输出结果不对。
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define int long long
#define debug cout<<"DEBUG"<<endl;
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define imp map<int,int>
using namespace std;
const int N=1e5+5;
int n,k,a[N],son[N*50][2],siz[N*50],cnt;
void insert(int x){
int p=0;
for(int i=30;i>=0;i--){
printf("id:%lld\n",p);
if(!son[p][(x>>i)&1]) son[p][(x>>i)&1]=++cnt;
siz[p]++;
p=son[p][(x>>i)&1];
}
siz[p]++;
}
struct pq{
int val,id,res;
bool operator <(const pq &k) const {
return val<k.val;
}
};
int query(int x,int k){
int p=0,ans=0;
for(int i=30;i>=0;i--){
//printf("id:%lld\n",p);
int now=(x>>i)&1;
if(k<=siz[son[p][now]]&&son[p][now]) p=son[p][now];
else{
k-=siz[son[p][now]];
p=son[p][now^1];
ans+=(1ll<<i);
}
}
return ans;
}
priority_queue<pq>q;
signed main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
insert(a[i]);
}
k*=2;
for(int i=1;i<=n;i++){
q.push((pq){a[i]^query(a[i],2),i,2});
printf("%lld ",a[i]^query(a[i],2));
}
printf("\n");
for(int i=1;i<=k;i++){
pq ans=q.top();
q.pop();
//if(i&1){
printf("%lld ",ans.val);
//}
if(ans.res==n) continue;
q.push((pq){a[ans.id]^query(a[ans.id],ans.res+1),ans.id,ans.res+1});
}
return 0;
}