#include <bits/stdc++.h>
using namespace std;
const int MAXS = 1000010;
const int MAXN = 100010;
char s[MAXN], subs[MAXS];
int n, x[MAXN], rt, op[MAXN], l[MAXN], r[MAXN], f[MAXN];
stack<int> stk;
int mark(int now) {
if (op[now] < 0) {
return x[-op[now]];
}
if (op[now] == 2) {
return 1 - mark(l[now]);
}
int a = mark(l[now]);
int b = mark(r[now]);
if (op[now] == 0) {
if (a == 0) f[r[now]] = 1;
if (b == 0) f[l[now]] = 1;
return a & b;
}
if (op[now] == 1) {
if (a == 1) f[r[now]] = 1;
if (b == 1) f[l[now]] = 1;
return a | b;
}
}
void markall(int now) {
if (op[now] < 0) return;
if (f[now]) {
f[l[now]] = 1;
if (op[now] != 2) f[r[now]] = 1;
}
markall(l[now]);
if (op[now] != 2) markall(r[now]);
}
int main() {
fgets(s, MAXS, stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &x[i]);
}
char *bgn = s;
while (sscanf(bgn, "%s", subs) != EOF) {
int len = strlen(subs);
bgn += len + 1;
rt++;
if (subs[0] == 'x') {
int value = 0;
for (int j = 1; j < len; j++) {
value = value * 10 + subs[j] - '0';
}
op[rt] = -value;
} else {
int lc, rc;
lc = stk.top(); stk.pop();
if (subs[0] != '!') {
rc = stk.top(); stk.pop();
swap(lc, rc);
}
if (subs[0] == '&') {
op[rt] = 0;
l[rt] = lc;
r[rt] = rc;
}
if (subs[0] == '|') {
op[rt] = 1;
l[rt] = lc;
r[rt] = rc;
}
if (subs[0] == '!') {
op[rt] = 2;
l[rt] = lc;
}
}
stk.push(rt);
}
int ans = mark(rt);
markall(rt);
int q;
scanf("%d", &q);
while (q--) {
int a;
scanf("%d", &a);
printf("%d\n", (f[a] ? ans : !ans));
}
return 0;
}