小苯的01背包(hard)
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

注:此版本为本题的hard(困难版),与easy(简单版)唯一的不同之处只有数据范围。

小苯有一个容量为 k 的背包,现在有 n 个物品,每个物品有一个体积 v 和价值 w,他想知道在体积不超过 k 的前提下,他最多能装价值为多少的物品。
本问题中,物品的总体积定义为所装物品的体积的 \&(按位与),总价值也定义为所装物品的价值的 \&(按位与)。
(如果不选物品,则价值为 0,所占体积也为 0。)

输入描述:

输入包含 n+1 行。
第一行两个正整数 n, k\ (1\leq n \leq 2\times10^5, 0 \leq k \leq 10^9),分别表示物品个数和背包容量。
加下来 n 行,每行两个正整数 v_i, w_i\ (0 \leq v_i, w_i \leq 10^9),表示每个物品的体积和价值。

输出描述:

输出包含一行一个整数,表示能装的最大价值。
示例1

输入

复制
3 1
7 3
10 7
9 6

输出

复制
2

说明

选择第一个和第三个物品。
体积为:7\ \& \ 9 = 1
价值为:3\ \&\ 6 = 2。可以证明不存在比 2 更大的价值。
示例2

输入

复制
3 2
7 3
10 7
9 6

输出

复制
3

说明

选第一个和第二个物品。