#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
#define ll long long
#define eb emplace_back
const ll MAXN=1e6+16;
struct node{
ll val,l,r,kind,fath;
};
ll n,q,x,cnt,root;
string s;
ll pos[MAXN];
bool a[MAXN],influ[MAXN];
node tree[MAXN];
stack<ll> stkn;
stack<char> stkc;
vector<string> expr;
inline void eval(){
ll l,r;
char op=stkc.top();
stkc.pop();
if(op!='!'){
r=stkn.top();
stkn.pop();
l=stkn.top();
stkn.pop();
if(op=='&'){
tree[++cnt]={tree[l].val&tree[r].val,l,r,2};
tree[l].fath=tree[r].fath=cnt;
}
else{
tree[cnt]={tree[l].val|tree[r].val,l,r,3};
tree[l].fath=tree[r].fath=cnt;
}
stkn.push(cnt);
}
else{
l=stkn.top();
stkn.pop();
tree[cnt]={!tree[l].val,l,-1,4};
tree[l].fath=cnt;
stkn.push(cnt);
}
return;
}
void findroot(ll idx){
if(tree[idx].fath0){
root=idx;
return;
}
findroot(tree[idx].fath);
return;
}
void dfs(ll idx){
if(tree[idx].kind1){
influ[idx]=true;
return;
}
if(tree[idx].kind2){
if(tree[tree[idx].l].val0&&tree[tree[idx].r].val1) dfs(tree[idx].l);
else if(tree[tree[idx].l].val1&&tree[tree[idx].r].val0) dfs(tree[idx].r);
else if(tree[tree[idx].l].val1&&tree[tree[idx].r].val1){
dfs(tree[idx].l);
dfs(tree[idx].r);
}
}
else if(tree[idx].kind3){
if(tree[tree[idx].l].val1&&tree[tree[idx].r].val0) dfs(tree[idx].l);
else if(tree[tree[idx].l].val0&&tree[tree[idx].r].val1) dfs(tree[idx].r);
else if(tree[tree[idx].l].val0&&tree[tree[idx].r].val0){
dfs(tree[idx].l);
dfs(tree[idx].r);
}
}
else dfs(tree[idx].l);
return;
}
int main(){
while(cin>>s){
if(s[0]>='0'&&s[0]<='9') break;
expr.eb(s);
}
n=stoi(s);
for(ll i=1;i<=n;i) cin>>a[i];
for(ll i=0;i<expr.size();i){
if(expr[i].front()=='x'){
tree[++cnt]={a[stoi(expr[i].substr(1))],-1,-1,1};
pos[stoi(expr[i].substr(1))]=cnt;
stkn.push(cnt);
}
else{
stkc.push(expr[i][0]);
eval();
}
}
findroot(1);
dfs(root);
cin>>q;
while(q--){
cin>>x;
if(influ[pos[x]]) cout<<(!tree[root].val);
else cout<<tree[root].val;
cout<<'\n';
}
return 0;
}