#include <iostream>
using namespace std;
struct node
{
bool is_not = true;
string data;
int lch , rch;
void init(bool b , string s , int l , int r)
{
is_not = b;
data = s;
lch = l;
rch = r;
}
}a[1000010];
bool num[1000010] , is[1000010];
int cnt , top;
int st[1000010];
int to_num(string s)
{
int ans = 0;
for (int i = 1; i < s.size(); i ++)ans = ans * 10 + s[i] - '0';
return ans;
}
void build()
{
string s , t;
getline(cin , t);
for (int i = 0; i < t.size(); i ++)
{
if ((t[i] != ' ' || t[i-1] == ' '))
{
s += t[i];
if (i != t.size() - 1)continue;
}
if (s == "!")a[cnt].is_not ^= 1;
else
{
if (s.size() == 1)a[++cnt].init(false , s , st[top--] , st[top--]);
else a[++cnt].init(false , s , -1 , -1);
st[++top] = cnt;
}
s = "";
}
}
bool ans(int id)
{
if (id == -1)return 0;
if (a[id].is_not)
{
a[id].is_not ^= 1;
bool res = ans(id);
a[id].is_not ^= 1;
return !res;
}
if ((a[id].data).size() == 1)
{
if (a[id].data == "&")return ans(a[id].lch) & ans(a[id].rch);
else return ans(a[id].lch) | ans(a[id].rch);
}
else return num[to_num(a[id].data)];
}
void get(int id)
{
string s = a[id].data;
if (s.size() != 1)
{
is[to_num(s)] = true;
return;
}
if (s == "|")
{
bool lans = ans(a[id].lch) , rans = ans(a[id].rch);
if (lans && rans)return;
if (!rans)get(a[id].lch);
if (!lans)get(a[id].rch);
}
if (s == "&")
{
bool lans = ans(a[id].lch) , rans = ans(a[id].rch);
if (!lans && !rans)return;
if (rans)get(a[id].lch);
if (lans)get(a[id].rch);
}
}
int main()
{
build();
int n;
cin >> n;
for (int i = 1; i <= n; i ++)cin >> num[i];
int q;
cin >> q;
bool ttt = ans(cnt);
get(cnt);
while (q --)
{
int x;
cin >> x;
if (is[x])cout << !ttt;
else cout << ttt;
cout << endl;
}
return 0;
}
评测记录