unittest
{
	assert( [ "3 7", "1 6 3" ].solve == 14 );
	assert( [ "4 9", "7 4 0 3" ].solve == 46 );
	assert( [ "1 0", "1000000000000" ].solve == 1000000000000 );
	
	assert( [ "3 6", "1 2 4" ].solve == 13 );		// 追加ケース
	assert( [ "3 5", "1 2 4" ].solve == 12 );		// 追加ケース
}



import std.algorithm;
import std.conv;
import std.format;
import std.range;
import std.stdio;

void main()
{
	stdin.byLineCopy.solve.writeln;
}

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = 0L;
	auto k = 0L;
	input.front.formattedRead!"%s %s"( n, k );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	
	// asの各bitが立っている数を集計
	auto ds = new long[ 40 ];
	foreach( i, a; as )
	{
		foreach( j, ref d; ds )
		{
			if( a & ( 1L << j ) ) d++;
		}
	}
	
	// dp[ 右からi桁目 ][ k未満フラグ ] = f(x)
	auto dp = new long[][]( 1 + ds.length, 2 );
	foreach_reverse( i, d; ds )
	{
		auto b = 1L << i;
		auto kb = k & b;
		auto va = b * ( as.length.signed - d );		// この桁を1にしたときのf(x)増加量
		auto vb = b * d;							// この桁を0にしたときのf(x)増加量
		
		// k同値 -> k同値
		if( kb ) dp[ i ][ 0 ] = max( dp[ i ][ 0 ], dp[ i + 1 ][ 0 ] + va );
		else     dp[ i ][ 0 ] = max( dp[ i ][ 0 ], dp[ i + 1 ][ 0 ] + vb );
		
		// k同値 -> k未満
		if( kb ) dp[ i ][ 1 ] = max( dp[ i ][ 1 ], dp[ i + 1 ][ 0 ] + vb );
		
		// k未満 -> k未満
		if( 0 < dp[ i + 1 ][ 1 ] ) dp[ i ][ 1 ] = max( dp[ i ][ 1 ], dp[ i + 1 ][ 1 ] + max( va, vb ) );
	}
	return dp[ 0 ].reduce!max;
}
