#include<cstdio>
using namespace std;
const int N=1e6+1000;
int n,cnt,id[N+10],a[N+10];
int ans[N+10];
struct node
{
int x,ls,rs,fa;
bool opt,f;
}p[N+10];
int st[N+10],top;
void dfs(int u,int fa)
{
p[u].fa=fa;
if(p[u].opt==1)
{
p[u].f=a[p[u].x];
return;
}
if(p[u].x==2)
{
dfs(p[u].rs,u);
p[u].f=!p[p[u].rs].f;
}
else
{
dfs(p[u].ls,u),dfs(p[u].rs,u);
if(p[u].x==0)
p[u].f=p[p[u].ls].f&p[p[u].rs].f;
else
p[u].f=p[p[u].ls].f|p[p[u].rs].f;
}
}
bool check(int u){return p[p[u].fa].ls==u?1:0;}
int f[N+10][2],gc[N+10][2],num;
bool solve(int u)
{
bool res=p[u].f^1;
num=0;
while(u!=st[top])
{
gc[++num][0]=u,gc[num][1]=res;
if(f[u][res]!=-1)
{
res=f[u][res];
break;
}
int fa=p[u].fa;
if(p[fa].x==2)
res=!res;
else
{
if(check(u))
{
if(p[fa].x==0)
res&=p[p[fa].rs].f;
else
res|=p[p[fa].rs].f;
}
else
{
if(p[fa].x==0)
res&=p[p[fa].ls].f;
else
res|=p[p[fa].ls].f;
}
}
u=fa;
}
for(int i=1;i<=num;i++)
f[gc[i][0]][gc[i][1]]=res;
return res;
}
int main()
{
// freopen("expr.in","r",stdin);
// freopen("expr.out","w",stdout);
char ch;int x;
while(scanf(" %c",&ch)==1)
{
if('0'<=ch&&ch<='9')
break;
cnt++;
p[cnt].opt=(ch=='x');
if(ch=='x')
{
scanf("%d",&x);
id[x]=cnt,st[++top]=cnt,p[cnt].x=x;
}
else
{
if(ch=='&'||ch=='|')
{
p[cnt].x=(ch=='|');
p[cnt].ls=st[top-1],p[cnt].rs=st[top];
top--;
st[top]=cnt;
}
else
p[cnt].x=2,p[cnt].rs=st[top],st[top]=cnt;
}
}
while(ch!=' '&&ch!='\n')
n=(n<<1)+(n<<3)+(ch^48),ch=getchar();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),ans[i]=-1;
for(int i=1;i<=cnt;i++)
f[i][0]=f[i][1]=-1;
dfs(st[top],0);
int q;
scanf("%d",&q);
while(q--)
{
scanf("%d",&x);
if(ans[x]==-1)
ans[x]=solve(id[x]);
printf("%d\n",ans[x]);
}
return 0;
}