显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 41000;
const int maxm = 100100;
struct Link{int to,next;}link[maxm*4];
int head[maxn]={0},tot = 0,sta[maxn],c = 0;
bool mark[maxn]={0};
int N,M;
void add(int from,int to){
link[++tot].to = to;
link[tot].next = head[from];
head[from] = tot;
}
bool dfs(int x){
if(mark[x^1])return false;
if(mark[x])return true;
sta[++c] = x;
mark[x] = true;
for(int i = head[x];i;i=link[i].next)
if(!dfs(link[i].to))return false;
return true;
}
bool running(){
for(int i = 0;i < 2*N;i+=2){
if(!mark[i]&&!mark[i^1]){
c = 0;
if(!dfs(i)){
while(c > 0)mark[sta[c--]] = false;
if(!dfs(i^1))return false;
}
}
}
return true;
}
int main(){
freopen("T3_.in","r",stdin);
freopen("T3_.out","w",stdout);
while(scanf("%d%d",&N,&M)!=EOF){
memset(mark,0,sizeof(mark));
c = 0;tot = 0;memset(head,0,sizeof(head));
N<<=1;int opt,a,b;
for(int i = 1;i <= M;i++){
scanf("%d",&opt);
switch(opt){
case 1:// i == true
scanf("%d",&a);a--;
add(a^1,a);
break;
case 2:// i == false
scanf("%d",&a);a--;
add(a,a^1);
break;
case 3:// i and j == true
scanf("%d%d",&a,&b);a--;b--;
add(a^1,a);
add(b^1,b);
break;
case 4:// i and (!j) == true -> i = true,j = false
scanf("%d%d",&a,&b);a--;b--;
add(a^1,a);
add(b,b^1);
break;
case 5: //i or j == true;
scanf("%d%d",&a,&b);a--;b--;
add(a^1,b);
add(b^1,a);
break;
case 6:// i or (not j) ->1 1 || 1 0 || 0 0
scanf("%d%d",&a,&b);a--;b--;
add(a^1,b^1);
add(b,a);
break;
case 7:// not (i and j) -> 1 0||0 1||0 0
scanf("%d%d",&a,&b);a--;b--;
add(a,b^1);
add(b,a^1);
break;
case 8://not (i or j) -> 0 0;
scanf("%d%d",&a,&b);a--;b--;
add(a,a^1);
add(b,b^1);
break;
case 9://i xor j -> i!=j
scanf("%d%d",&a,&b);a--;b--;
add(a^1,b);
add(a,b^1);
add(b^1,a);
add(b,a^1);
break;
case 10://not (i xor j)->(i xor j)=false->i == j
scanf("%d%d",&a,&b);a--;b--;
add(a,b);
add(b,a);
add(a^1,b^1);
add(b^1,a^1);
break;
case 11://i xor (not j)->0 0 1 1 i = j
scanf("%d%d",&a,&b);a--;b--;
add(a,b);
add(a^1,b^1);
add(b^1,a^1);
add(b,a);
break;
case 12://(!i) or (!j) 0 0 || 0 1 || 1 0
scanf("%d%d",&a,&b);a--;b--;
add(a,b^1);
add(b,a^1);
break;
}
}
if(!running()){puts("die");}
else {
for(int i = 0;i < N;i++){
if(mark[i])printf("%d ",i+1);
}
printf("\n");
}
}
}