有向图 拓扑排序 顺便判断有没有环
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int N=1e4+10;
int T,n,m,k,q1,val[N],du[N],tmpdu[N],x;
vector<int> to[N],q[N],cnt[N];
string type[N];
string s;
int getnum(string s){
int len=s.size();
int add=0;
if(s[0]=='I')add=m;
int num=0;
rep(i,1,len-1)num=num*10+s[i]-'0';
return num+add;
}
int work(int x){
if(type[x]=="NOT"){
return !cnt[x][0];
}
if(type[x]=="XOR"){
rep(i,1,cnt[x].size()-1){
cnt[x][0]^=cnt[x][i];
}
return cnt[x][0];
}
if(type[x]=="AND"){
rep(i,1,cnt[x].size()-1){
cnt[x][0]&=cnt[x][i];
}
return cnt[x][0];
}
if(type[x]=="OR"){
rep(i,1,cnt[x].size()-1){
cnt[x][0]|=cnt[x][i];
}
return cnt[x][0];
}
if(type[x]=="NAND"){
rep(i,1,cnt[x].size()-1){
cnt[x][0]&=cnt[x][i];
}
return !cnt[x][0];
}
if(type[x]=="NOR"){
rep(i,1,cnt[x].size()-1){
cnt[x][0]|=cnt[x][i];
}
return !cnt[x][0];
}
}
void DAG(int ip){
rep(i,1,n)val[i+m]=q[ip][i-1];
queue<int> Q;
rep(i,1,n)Q.push(i+m);
while(Q.size()){
//cout<<Q.size()<<"\n";
int x=Q.front(); Q.pop();
if(to[x].size())rep(i,0,to[x].size()-1){
int y=to[x][i];
cnt[y].push_back(val[x]);
du[y]--;
if(du[y]==0){
val[y]=work(y);
Q.push(y);
}
}
}
}
int main(){
scanf("%d",&T);
while(T--){
memset(du,0,sizeof(du));
memset(tmpdu,0,sizeof(tmpdu));
scanf("%d%d",&n,&m);
rep(i,1,n+m)to[i].clear();
rep(i,1,m){
cin>>s>>k;
type[i]=s;
rep(j,1,k){
cin>>s;
//cout<<s<<" "<<getnum(s)<<"\n";
to[getnum(s)].push_back(i);
du[i]++;
tmpdu[i]++;
}
}
cin>>q1;
rep(i,1,q1)q[i].clear();
rep(i,1,q1)rep(j,1,n){
scanf("%d",&x);
q[i].push_back(x);
}
int flag=0;
rep(i,1,q1){
memset(val,0,sizeof(val));
rep(j,1,n+m)du[j]=tmpdu[j];
rep(j,1,n+m)cnt[j].clear();
if(!flag)DAG(i);
rep(j,1,m)if(du[j])flag=1;
{
scanf("%d",&x);
rep(j,1,x){
int pos;
scanf("%d",&pos);
if(!flag)cout<<val[pos]<<" ";
}if(!flag)cout<<"\n";
}
}
if(flag)puts("LOOP");
}
return 0;
}