#include<iostream>
#include<string>
#include<stack>
using namespace std;
int trans(char ch){
if(ch=='&') return 1;
else if(ch=='|') return 2;
else if(ch=='!') return 3;
else return 0;
}
int trans_n(string ch){
int x=0;
for(int i=1;i<ch.length();i++){
x*=10;
x+=ch[i]-'0';
}
return x;
}
struct node{
int lson,rson;
}tree[114514];
int numtrans[114514];
bool numlis[114514];
bool ans[114514];
int opr[114514];
stack<int> stk;
int n,q,k;
string s;
void cal(int pos){
if(opr[pos]==0){
ans[pos]=numlis[numtrans[pos]];
return;
}
if(opr[pos]!=3)cal(tree[pos].lson);
cal(tree[pos].rson);
if(opr[pos]==1){
ans[pos]=ans[tree[pos].lson]&&ans[tree[pos].rson];
}else{
ans[pos]=ans[tree[pos].lson]||ans[tree[pos].rson];
}
}
bool vst[114514];
void change_rec(int pos){
if(opr[pos]==0){
vst[pos]=true;
return;
}else if(opr[pos]==1){
change_rec(tree[pos].lson);
if(ans[tree[pos].lson]!=0) change_rec(tree[pos].rson);
}else if(opr[pos]==2){
change_rec(tree[pos].lson);
if(ans[tree[pos].lson]!=1) change_rec(tree[pos].rson);
}else{
change_rec(tree[pos].rson);
}
}
int main(){
while(cin>>s){
if(s[0]!='x'&&s[0]!='!'){
int a=stk.top();
stk.pop();
int b=stk.top();
stk.pop();
k++;
tree[k]={b,a};
stk.push(k);
}else if(s[0]!='x'&&s[0]=='!'){
int a=stk.top();
stk.pop();
k++;
tree[k].rson=a;
stk.push(k);
}else{
stk.push(trans_n(s));
n++;
k++;
numtrans[k]=n;
}
opr[k]=trans(s[0]);
}
int root=stk.top();
cin>>n;
for(int i=1;i<=n;i++){
cin>>numlis[i];
}
cal(root);
cin>>q;
while(q--){
int t;
cin>>t;
if(vst[t]==true) cout<<!ans[root]<<endl;
else cout<<ans[root]<<endl;
}
return 0;
}