#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
string s;
int q[MAXN],tr[MAXN],a[MAXN],b[MAXN],flag[MAXN],c[MAXN],le[MAXN],ri[MAXN],f[MAXN];
//1:number 2:and 3:or 4:not
int n,T,x,top=0,tot=0;
void dfs (int k){
if (flag[k]==1) {f[c[k]]=1;return;}
if (flag[k]==2){
if (tr[le[k]]+tr[ri[k]]==2) dfs(le[k]),dfs(ri[k]);
else if (tr[le[k]]) dfs(ri[k]); else if (tr[ri[k]]) dfs(le[k]);
return;
}
if (flag[k]==3){
if (tr[le[k]]+tr[ri[k]]==0) dfs(le[k]),dfs(ri[k]);
else if (!tr[le[k]]) dfs(ri[k]); else if (!tr[ri[k]]) dfs(le[k]);
return;
}
dfs(le[k]);
}
int main(){
//freopen("expr.in","r",stdin);
//freopen("expr.out","w",stdout);
getline(cin,s);
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
for (int i=0;i<s.length();++i) if (s[i]!=' ') {
if (s[i]=='x') {
int num=0;
while (isdigit(s[++i])) num=num*10+(s[i]^48);
b[++top]=a[num];
tr[++tot]=a[num]; flag[tot]=1; c[tot]=num;
q[top]=tot;
continue;
}
if (s[i]=='&'){
b[--top]=b[top]&b[top+1];
tr[++tot]=b[top]; flag[tot]=2; le[tot]=q[top]; ri[tot]=q[top+1];
q[top]=tot;
continue;
}
if (s[i]=='|'){
b[--top]=b[top]|b[top+1];
tr[++tot]=b[top]; flag[tot]=3; le[tot]=q[top]; ri[tot]=q[top+1];
q[top]=tot;
continue;
}
if (s[i]=='!'){
b[top]=b[top]^1;
tr[++tot]=b[top]; flag[tot]=4; le[tot]=q[top];
q[top]=tot;
}
}
int ans=tr[tot];
//for (int i=1;i<=tot;++i) printf("Tree %d : %d %d L son : %d R son : %d\n",i,tr[i],flag[i],flag[i]>1?le[i]:-1,flag[i]>1&&flag[i]!=4?ri[i]:-1);
dfs(tot);
scanf("%d",&T);
while (T--){
scanf("%d",&x);
if (!f[x]) printf("%d\n",ans); else printf("%d\n",ans^1);
}
}