import std.stdio, std.conv, std.string, std.bigint;
import std.math, std.random, std.datetime;
import std.array, std.range, std.algorithm, std.container, std.format;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

/*

けたごとに見る。
A[i]たちについて、そのけたで1が多ければXのそのけたは0、0が多ければXのそのけたは1

それを集めれば良いが…、K以下という制限がある
その場合は、上のほうのけたを、やむなく1が良かったのに0にする

*/

void main(){
	int n = read.to!int;
	long k = read.to!long;
	long[] as = readln.chomp.split.map!(to!long).array;
	
	long xt; // kを超えているかもしれないが
	int maxi;
	for(int i = 0; (1L<<i) < 2 * k; i ++){
		int cnt;
		foreach(a; as) if((1L<<i) & a) cnt += 1;
		if(cnt * 2 < n) xt += 1L<<i;
		maxi = i;
		debug writeln("i:", i, " cnt:", cnt, " xt:", xt);
	}
	
	long[] xs = [0]; // k以下である候補
	
	foreach_reverse(i; 0 .. maxi + 1){
		if(! ((1L<<i) & xt)) continue;
		if(((1L<<i) ^ xt) <= k) xs ~= (1L<<i) ^ xt;
		else xt ^= (1L<<i);
	}
	debug writeln("xs:", xs);
	
	
	long ans;
	foreach(x; xs){
		long tmpans = 0;
		foreach(a; as) tmpans += x ^ a;
		if(tmpans > ans) ans = tmpans;
		debug writeln("x:", x, " tmpans:", tmpans, " ans:", ans);
	}
	ans.writeln;
}
