include [HTML_REMOVED]
// 思路:从高位往低位填,最好要填1,且能填的条件是不能超过m,因为攻击力要小于m
// 如果不会大于m,那么就要对填上0 和 1的组合计算结果进行判断,那个大就选那个,不是0就是1
// 如果发现填0的大,就填0(如果结果一样也是填0,如果填1,那么后面的位能填的结果就变小了)
// 否则填1,同时要用m减去这一位上的1,然后再继续运算
// 如果发现大于m那么就只能填0
const int N = 100005;
int ans;// 最初所有为都是0,慢慢填
int n,m;
int t[N];
int op[N];
char str[4];
bool calc(bool a,int b)// 0 ,i或者1,i
{
for(int i=0;i[HTML_REMOVED]>b&1 就是取出第b位
if(op[i] == 1)a|=t[i]>>b[HTML_REMOVED]
else if(op[i] == 2)a&=t[i]>>b[HTML_REMOVED]
else a^=t[i]>>b[HTML_REMOVED]
}
return a;
}
int main()
{
scanf("%d %d", &n, &m);
for(int i = 0;i<n;i++)
{
scanf("\n%s %d", str, &t[i]);
// scanf("\n%s %d", str, t[i]); 典型错误
// t[i] 是一个整数变量,用于存储读取的整数值,
// 而 t + i 是一个指针,指向 t 数组中的第 i 个整数元素
if(*str=='O')op[i] = 1;
else if(*str=='A')op[i] = 2;
else op[i] = 3;
}
for(int i = 29;~i;i--)
{
if(1<<i<=m)
{
bool x= calc(0,i);
bool y = calc(1,i);
// x 和 y不是 0 就是 1不是你大就是我大
if(x>=y)
{
ans |= x<<i;
}else
{
ans |= y<<i;
m -= 1 << i;
}
}
else ans |= calc(0,i)<<i;
}
printf("%d\n",ans);
return 0;
}