#include <bits/stdc++.h>
using namespace std;
const int N = 1100000;
struct Tree {
int l, r;
} p[N];
int n, m, Q, top, cnt, q[N], v[N], side[N];
char s[10], b[N];
bool fan[N], ans[N];
inline void dfs(int x) {
if (!side[x]) {
v[x] ^= fan[x];
return;
}
dfs(p[x].l);
dfs(p[x].r);
if (side[x] == 1)
v[x] = v[p[x].l] & v[p[x].r];
if (side[x] == 2)
v[x] = v[p[x].l] | v[p[x].r];
v[x] ^= fan[x];
}
inline void find(int x) {
if (!side[x]) {
ans[x] = true;
return;
}
if (v[p[x].l] && side[x] == 1)
find(p[x].r);
if (!v[p[x].l] && side[x] == 2)
find(p[x].r);
if (v[p[x].r] && side[x] == 1)
find(p[x].l);
if (!v[p[x].r] && side[x] == 2)
find(p[x].l);
}
int main() {
while (1) {
scanf("%s", s + 1);
if (s[1] >= '0' && s[1] <= '9') {
n = s[1] - '0';
break;
}
if (s[2] >= '0' && s[2] <= '9')
b[++cnt] = s[2];
else
b[++cnt] = s[1];
}
m = n;
for (int i = 1; i <= cnt; i++) {
if (b[i] >= '0' && b[i] <= '9')
q[++top] = b[i] - '0';
else if (b[i] == '!')
fan[q[top]] = true;
else if (b[i] == '&') {
int u = q[top--];
int v = q[top--];
p[++m].l = u;
p[m].r = v;
side[m] = 1;
q[++top] = m;
} else {
int u = q[top--];
int v = q[top--];
p[++m].l = u;
p[m].r = v;
side[m] = 2;
q[++top] = m;
}
}
for (int i = 1; i <= n; i++)
scanf("%d", &v[i]);
dfs(m);
find(m);
scanf("%d", &Q);
for (; Q--; ) {
int x;
scanf("%d", &x);
printf("%d\n", ans[x] ^ v[m]);
}
return 0;
}