#include<bits/stdc++.h>
using namespace std;
const int N=500010;
struct Node{
long long w;
int x,y;
bool operator<(const Node&x) const{
return w<x.w;
}
}d[N];
int trie[N*32][2],num[N*32];
int k,n,tot;
long long a[N];
priority_queue<Node> q;
void insert(long long val){
int u=0;
for(int i=31;i>=0;i--){
int z=(val>>i)&1;
if(!trie[u][z]) trie[u][z]=++tot;
u=trie[u][z];
num[u]++;
}
}
int find(long long val,int t){
int u=0;
long long s=0;
for(int i=31,z;i>=0;i--){
z=(val>>i)&i;
if(num[trie[u][z^1]]>=t){
u=trie[u][z^1];
s|=(1LL<<i);
}
else{
t-=num[trie[u][z^1]];
u=trie[u][z];
}
}
return s;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i]^=a[i-1];
}
for(int i=0;i<=n;i++) insert(a[i]);
k*=2;
for(int i=0;i<=n;i++){
d[i].w=find(a[i],1);
d[i].x=i;
d[i].y=1;
q.push(d[i]);
}
long long ans=0;
for(int i=1;i<=k;i++){
Node A=q.top();
ans+=A.w;
q.pop();
d[A.x].y++;
d[A.x].w=find(a[A.x],d[A.x].y);
q.push(d[A.x]);
}
ans/=2;
printf("%lld",ans);
}