35pts,WA on #1 #2 #3 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20
#include<bits/stdc++.h>
using namespace std;
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
return;
}
int tmp,n,i,p,cnt;
bool a[100001],fe[100001];
char c;
stack<int> q;
struct node{
int num;
bool pd=0,fann=0;
};
map<int,node> dot;
void dfs(int u){
int tmp;
tmp=q.top();
q.pop();
while(tmp==-3){
tmp=q.top();
q.pop();
dot[u].fann^=1;
}
dot[u].num=tmp;
if(tmp>0){
dot[u].pd=a[tmp]^dot[u].fann;
}
else{
dfs(u*2);
dfs(u*2+1);
if(tmp==-1){
dot[u].pd=(dot[u*2].pd&dot[u*2+1].pd)^dot[u].fann;
}
else{
dot[u].pd=(dot[u*2].pd|dot[u*2+1].pd)^dot[u].fann;
}
}
}
void f(int u){
if(dot[u].num>0){
fe[dot[u].num]=1;
return;
}
f(u*2);
f(u*2+1);
}
void fei(int u){
bool flag1=1,flag2=1;
if(dot[u].num==-1){
if(dot[u*2].pd==0){
f(u*2+1);
flag2=0;
}
if(dot[u*2+1].pd==0){
f(u*2);
flag1=0;
}
}
else if(dot[u].num==-2){
if(dot[u*2].pd==1){
f(u*2+1);
flag2=0;
}
if(dot[u*2+1].pd==1){
f(u*2);
flag1=0;
}
}
else{
return;
}
if(flag1){
fei(u*2);
}
if(flag2){
fei(u*2+1);
}
}
int main(){
c=getchar();
while(c!='\n'){
if(c=='x'){
tmp=0;
c=getchar();
while(c>='0'&&c<='9'){
tmp=(tmp<<3)+(tmp<<1)+(c^48);
c=getchar();
}
q.push(tmp);
}
else if(c=='&'){
q.push(-1);
c=getchar();
}
else if(c=='|'){
q.push(-2);
c=getchar();
}
else if(c=='!'){
q.push(-3);
c=getchar();
}
else if(c=='\n'){
break;
}
else{
c=getchar();
}
}
n=read();
for(i=1;i<=n;i++){
cin>>a[i];
}
dfs(1);
fei(1);
p=read();
for(i=1;i<=p;i++){
tmp=read();
write(dot[1].pd^(!fe[tmp]));
puts("");
}
return 0;
}