注意到:由于是按位与操作,所以选取的物品越多,结果是一定不会增的,而且,如果我们想让答案中这一位为1,一定要选取的所有数的这一位都为1才行,所以我们从高位开始构建结果,由于一个物品可以反复进行添加,他对结果是没有影响的,所以我们在枚举每一位的时候直接枚举所有的元素就行

#include <bits/stdc++.h>
#define int long long
using namespace std ; 
signed main()
{
    int n , k ; cin >> n >> k ; 
    vector<pair<int , int>>mp(n) ; 
    for(int i = 0 ; i < n ; i++)
    {
        cin >> mp[i].first >> mp[i].second ; 
    }
    int c = 0 ; 
    for(int i = 30 ; i >= 0 ; i--)
    {
        int nc = c | (1LL << i) ;
        bool found = false ; 
        int cur = -1 ; 
        for(int i = 0 ; i < n ; i++)
        {
            if((mp[i].second & nc) == nc)
            {
                if(!found)
                {
                    cur = mp[i].first ; 
                    found = true ; 
                }
                else
                {
                    cur &= mp[i].first ; 
                }
            }
        }
        if(found && cur <= k)
        {
            c = nc ;        
        }
    }
    cout << c << endl ; 
    return 0 ; 
}