1 //Result:wizmann 3905 Accepted 16516K 1985MS G++ 2170B 2012-10-08 16:19:01
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <iostream>
6 #include <algorithm>
7 #include <stack>
8
9 using namespace std;
10
11 #define print(x) cout<<x<<endl
12 #define input(x) cin>>x
13 #define SIZE 2048
14 #define EDGE 4096000
15
16 struct node
17 {
18 int val,next;
19 node(){}
20 node(int ival,int inext)
21 {
22 val=ival;
23 next=inext;
24 }
25 };
26
27 int n,m;
28 int head[SIZE];
29 node g[EDGE];
30 int ind;
31
32 char instack[SIZE];
33 stack<int> st;
34 int dfn[SIZE],scc[SIZE],num[SIZE],low[SIZE];
35 int sccnr,nr;
36
37 void init()
38 {
39 ind=0;
40 memset(head,-1,sizeof(head));
41 memset(instack,0,sizeof(instack));
42 memset(scc,0,sizeof(scc));
43 memset(num,0,sizeof(num));
44 memset(low,0,sizeof(low));
45 memset(dfn,0,sizeof(dfn));
46 st=stack<int>();
47 nr=1;sccnr=0;
48 }
49
50 void tarjan(int pos)
51 {
52 low[pos]=dfn[pos]=nr++;
53 st.push(pos);
54 instack[pos]=1;
55
56 for(int i=head[pos];i!=-1;i=g[i].next)
57 {
58 int j=g[i].val;
59 if(!dfn[j])
60 {
61 tarjan(j);
62 low[pos]=min(low[pos],low[j]);
63 }
64 else if(instack[j])
65 {
66 low[pos]=min(low[pos],dfn[j]);
67 }
68 }
69
70 if(dfn[pos]==low[pos])
71 {
72 sccnr++;
73 while(1)
74 {
75 int t=st.top();
76 instack[t]=0;
77 st.pop();
78 scc[t]=sccnr;
79 num[sccnr]++;
80 if(t==pos) break;
81 }
82 }
83 }
84
85 inline void addEdge(int a,int b)
86 {
87 g[ind]=node(b,head[a]);
88 head[a]=ind++;
89 }
90
91 bool zSat()
92 {
93 for(int i=0;i<n*2;i++)
94 {
95 if(!dfn[i]) tarjan(i);
96 }
97 for(int i=0;i<n;i++)
98 {
99 if(scc[i]==scc[i+n]) return false;
100 }
101 return true;
102 }
103
104 int main()
105 {
106 freopen("input.txt","r",stdin);
107 int a,b;
108 while(input(n>>m))
109 {
110 init();
111 for(int i=0;i<m;i++)
112 {
113 scanf("%d%d",&a,&b);
114 if(a>0 && b>0) // a or b => (a+n,b),(b+n,a)
115 {
116 a=abs(a);
117 b=abs(b);
118 --a;--b;
119
120 addEdge(a+n,b);
121 addEdge(b+n,a);
122 }
123 else if(a<0 && b<0) // not a or not b =>(a,b+n),(b,a+n)
124 {
125 a=abs(a);
126 b=abs(b);
127 --a;--b;
128
129 addEdge(a,b+n);
130 addEdge(b,a+n);
131 }
132 else if(a>0 && b<0) // a or not b =>(a+n,b+n),(b,a)
133 {
134 a=abs(a);
135 b=abs(b);
136 --a;--b;
137
138 addEdge(a+n,b+n);
139 addEdge(b,a);
140 }
141 else if(a<0 && b>0) // not a or b =>(a,b),(b+n,a+n)
142 {
143 a=abs(a);
144 b=abs(b);
145 --a;--b;
146
147 addEdge(a,b);
148 addEdge(b+n,a+n);
149 }
150 }
151 if(zSat()) puts("1");
152 else puts("0");
153 }
154 return 0;
155 }