#include <bits/stdc++.h>
using namespace std;
inline long long read()
{
long long x = 0;
char ch = getchar();
while (ch < '0' || ch > '9')
ch = getchar();
while (ch >= '0' && ch <= '9')
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
return x;
}
inline void print(long long x)
{
if (x < 0)
{
putchar('-');
x = -x;
}
if (x >= 10)
print(x / 10);
putchar(x % 10 + 48);
}
const int maxn = 1e5 + 10;
class edge
{
public:
long long oper, t;
} v[maxn];
int n, m;
long long check(long long tmp)
{
for (int j = 1; j <= n; j++)
{
if (v[j].oper == 1)
tmp &= v[j].t;
else if (v[j].oper == 2)
tmp |= v[j].t;
else if (v[j].oper == 3)
tmp ^= v[j].t;
}
return tmp;
}
long long dfs(int cur, long long x)
{
if (x > m || cur > 32)
return 0;
long long ans;
if (cur == -1 && m >= 1)
{
int a = check(1), b = check(0);
ans = max(a, b);
if (a < b)
dfs(cur + 1, 0);
else
dfs(cur + 1, 1);
}
else
{
long long a = check(x * 3), b = check(x);
ans = max(a, b);
if (x * 3 > m)
dfs(cur + 1, x);
else if (a < b)
dfs(cur + 1, x);
else
dfs(cur + 1, x * 3);
}
return ans;
}
long long ans = -0x3f3f3f3f, limit;
int main()
{
freopen("P2114_2.in", "r", stdin);
n = read(), m = read();
for (int i = 1; i <= n; i++)
{
string tmp;
cin >> tmp;
if (tmp == "AND")
v[i].oper = 1;
else if (tmp == "OR")
v[i].oper = 2;
else if (tmp == "XOR")
v[i].oper = 3;
v[i].t = read();
}
print(dfs(-1, 0));
return 0;
}
dfs 里面的 cur 代表当前尝试的位数, x 是当前的大小,如果下一位填写 1 会比填写 0 大,填写 1 ,反之填写 0 ,但是这个代码 WA 了一半,我直接让所有位数都是 1 都可以拿下 60 分,蒟蒻求助