#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
stack<int> s;
string a,b;
bool flg[N];
vector<int> tree[N];
int v[N],n,m,q;
char p[N];
void dfs(int x)
{
flg[x] = true;
if(x <= n)
{
return;
}
if(p[x] == '!')
{
dfs(tree[x][0]);
}
else
{
int lc = tree[x].front();
int rc = tree[x].back();
if(p[x] == '&')
{
if(v[lc] == 1)
{
dfs(rc);
}
if(v[rc] == 1)
{
dfs(lc);
}
}
else if(p[x] == '|')
{
if(v[lc] == 0)
{
dfs(rc);
}
if(v[rc] == 0)
{
dfs(lc);
}
}
}
}
int main()
{
getline(cin,a);
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf(" %d",&v[i]);
}
int len=a.size();
m=n;
for(int i = 0;i < len;i++)
{
if(isdigit(a[i]))
{
b+=a[i];
if(i==len-1 || !isdigit(a[i+1]))
{
int tmp=stoi(b);
s.push(tmp);
b = "";
}
else if(a[i] == '!')
{
p[++m] = a[i];
int c = s.top();
s.pop();
v[m] = !v[c];
s.push(m);
tree[m].push_back(c);
}
else if(a[i] == '&' || a[i] == '|')
{
p[++m] = a[i];
int lc = s.top();
s.pop();
int rc = s.top();
s.pop();
if(a[i] == '&')
{
v[m] = v[lc] & v[rc];
}
else
{
v[m] = v[lc] | v[rc];
}
s.push(m);
tree[m].push_back(lc);
tree[m].push_back(rc);
}
}
}
int ans = v[s.top()];
dfs(s.top());
scanf("%d",&q);
while(q--)
{
int tmp;
scanf("%d",&tmp);
if(flg[tmp] == true)
{
printf("%d\n", !ans);
}
else
{
printf("%d\n",ans);
}
}
return 0;
}
本人太弱了,查不出一点问题