通过一个全0 和 全1的二进制int数进行一系列操作可以得到每一位上如果填0或1的时候是什么样的情况。然后从前向后遍历二进制位,如果当前位可以由0变化成1那么可以直接将结果伤害的这一位填上1,如果只能由1变成1那么就需要判断当前的位上的原始伤害会不会超过范围,如果超过了就意味着无法填1。
#include <bits/stdc++.h>

using namespace std;

inline int read() {
    int x=0, y=1;
    char c = getchar();
    while (c=='-') {
        y = -y;
        c = getchar();
    }
    while (c>='0'&&c<='9') {
        x = x*10+(c-'0');
        c = getchar();
    }
    return x;
}

int main() {
    int n = read(), m = read();
    int all0=0, all1=-1;
    while (n--) {
        string op;
        cin>>op;
        getchar();
        int t = read();
        if (op[0]=='A') {
            all0 &= t; all1 &= t;
        } else if (op[0]=='O') {
            all0 |= t; all1 |= t;
        } else {
            all0 ^= t; all1 ^= t;
        }
    }
    int i = 0, ans=0;
    for (i = (1<<30);i;i>>=1) {
        if (all0&i) ans|=i;
        else if (all1&i&&i<=m) {
            m ^= i;
            ans |= i;
        }
    }
    cout<<ans;
    return 0;
}