90pts求助
#include<bits/stdc++.h>
using namespace std;
vector<int>q[1000000];
int qqq[100001];
int aa[100001],lll;
char b[1000001];
int bc[1000001];
int cnt=0,cnt2=0;
string a;
struct node
{
int cnt;
bool x;
}t,tt;
stack<node>qq;
void huo()
{
tt=qq.top();
qq.pop();
t=qq.top();
if(tt.x==1&&t.x==1)
qq.top().cnt=0;
if(tt.x==0&&t.x==1)
q[tt.cnt].clear();
if(tt.x==1&&t.x==0)
{
q[qq.top().cnt].clear();
qq.top().cnt=tt.cnt;
if(qq.top().cnt==0)
qq.top().cnt=cnt++;
}
if(tt.x==0&&t.x==0)
{
if(qq.top().cnt==0)
qq.top().cnt=cnt++;
if(tt.cnt!=0)
q[qq.top().cnt].push_back(tt.cnt);
}
qq.top().x=tt.x|t.x;
}
void yu()
{
tt=qq.top();
qq.pop();
t=qq.top();
if(tt.x==0&&qq.top().x==0)
qq.top().cnt=0;
if(tt.x==1&&qq.top().x==0)
{
q[tt.cnt].clear();
}
if(tt.x==0&&qq.top().x==1)
{
q[qq.top().cnt].clear();
qq.top().cnt=tt.cnt;
if(qq.top().cnt==0)
qq.top().cnt=cnt++;
}
if(tt.x==1&&qq.top().x==1)
{
if(qq.top().cnt==0)
qq.top().cnt=cnt++;
if(tt.cnt!=0)
q[qq.top().cnt].push_back(tt.cnt);
}
qq.top().x=tt.x&t.x;
}
void ycl()
{
cnt=1;
for(int i=1;i<=cnt2;i++)
{
if(bc[i]<1000010)
{
t.x=aa[bc[i]];
q[cnt].push_back(bc[i]);
t.cnt=cnt++;
qq.push(t);
}
else
{
char t=b[bc[i]-1000010];
if(t=='|')
huo();
else
if(t=='&')
yu();
else
qq.top().x=!qq.top().x;
}
}
}
void inline pd(int x)
{
for(int i=0;i<q[x].size();i++)
{
if(i>0)
pd(q[x][i]);
else
qqq[q[x][0]]=1;
}
}
int main()
{
getline(cin,a);
for(int i=0;i<a.size();i++)
{
++cnt2;
while(i<a.size()&&a[i]!=' ')
{
if(a[i]=='x')
{i++;
while(i<a.size()&&a[i]!=' ')
{
bc[cnt2]=bc[cnt2]*10+a[i]-'0';
i++;
}
break;
}
b[++cnt]=a[i++];
bc[cnt2]=cnt+1000010;
}
}
int n,ql;
cin>>n;
for(int i=1;i<=n;i++)
cin>>aa[i];
ycl();
pd(qq.top().cnt);
cin>>ql;
for(int i=1;i<=ql;i++)
{
cin>>lll;
if(qqq[lll])
cout<<!qq.top().x<<endl;
else
cout<<qq.top().x<<endl;
}
}