#include #include using namespace std; using namespace atcoder; using ll=long long; int main() { ll n,k; cin>>n>>k; vector a(n); for(int i=0;i>a[i]; vector> graph; vector sz; { graph.push_back(make_pair(-1,-1)); sz.push_back(0); int k=1; auto dfs=[&](auto dfs,int now,int d,int val)->int{ if(d==-1){ sz[now]++; return sz[now]; } if((val>>d&1)==0){ if(graph[now].first==-1){ graph[now].first=k++; graph.push_back(make_pair(-1,-1)); sz.push_back(0); } sz[graph[now].first]=dfs(dfs,graph[now].first,d-1,val); }else{ if(graph[now].second==-1){ graph[now].second=k++; graph.push_back(make_pair(-1,-1)); sz.push_back(0); } sz[graph[now].second]=dfs(dfs,graph[now].second,d-1,val); } return sz[now]=(graph[now].first==-1?0:sz[graph[now].first])+(graph[now].second==-1?0:sz[graph[now].second]); }; for(int i=0;ill{ if(d==-1)return 0LL; ll res=0; if(c>>d&1){ if(val>>d&1){ if(graph[now].second!=-1)res+=sz[graph[now].second]; if(graph[now].first!=-1)res+=dfs(dfs,graph[now].first,d-1,val); }else{ if(graph[now].first!=-1)res+=sz[graph[now].first]; if(graph[now].second!=-1)res+=dfs(dfs,graph[now].second,d-1,val); } }else{ if((val>>d&1)==0&&graph[now].first!=-1)res+=dfs(dfs,graph[now].first,d-1,val); else if((val>>d&1)==1&&graph[now].second!=-1)res+=dfs(dfs,graph[now].second,d-1,val); } return res; }; for(int i=0;i=k)r=c; else l=c; } cout<