import java.math.*

fun main(args: Array<String>) {
    val (n, k) = readInputLine().split(" ").map{it.toLong()}
    val aList = readInputLine().split(" ").map{it.toLong()}

    // dp[i][j] 上位i桁目を見たとき、j = 1ならばKと同一ビット列、j = 0ならばKと異なるビット列(Kより小さい)のときの総和
    val dp = Array(50, {Array(2, {-1L})})
    
    dp[0][1] = 0L
    
    for (i in 1..49) {
        val mask = 1L shl (50 - i - 1)
        
        var cnt1 = 0
        
        for (a in aList) {
            if (a and mask != 0L) {
                cnt1++
            }
        }
        
        val cnt0 = n - cnt1
        
        // i - 1桁目がちょうど一致する場合からの遷移
        if (mask and k != 0L) {
            // Kの上位からiビット目が1
            if (dp[i - 1][1] != -1L) {
                // *一致しない*ビットの数が総和に寄与するので、ビットと反対のビットのカウントを用いる
                dp[i][1] = Math.max(dp[i][1], dp[i - 1][1] + mask * cnt0)
                dp[i][0] = Math.max(dp[i][0], dp[i - 1][1] + mask * cnt1)
            }
        } else {
            // Kの上位からiビット目が0
            if (dp[i - 1][1] != -1L) {
                // iビット目が0なので、iビット目を1とする遷移はできない
                dp[i][1] = Math.max(dp[i][0], dp[i - 1][1] + mask * cnt1)
            }
            
        }
        
        // i - 1桁目がちょうど一致しない場合の遷移はKのビットに依存しない
        if (dp[i - 1][0] != -1L) {
            dp[i][0] = Math.max(dp[i][0], Math.max(dp[i - 1][0] + mask * cnt0, dp[i - 1][0] + mask * cnt1)) 
        }
    }

    println(Math.max(dp[49][0], dp[49][1]))
}

fun readInputLine(): String {
    return readLine()!!
}
