```
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
struct edge{
int to,next;
}e[maxn],e2[maxn];
int head[maxn],head2[maxn],cnt2=0,cnt=0,n,m;
inline void add_edge(int s,int t,bool b){
if(b==1) {
e[++cnt].next=head[s];e[cnt].to=t;head[s]=cnt;
}
else {
e2[++cnt2].next=head2[s];e2[cnt2].to=t;head2[s]=cnt2;
}
}
inline int get_num(int x,int b){
if(x<=n&&b==1)return x;
else if(x<=n&&b==0)return x+n;
else if(x>n&&b==1)return x;
else return x-n;
}
vector<int>v;
bool book[maxn];
int belong[maxn],temp=0;
inline void dfs1(int s){
book[s]=1;
for(register int i=head[s];i;i=e[i].next){
if(!book[e[i].to]){
dfs1(e[i].to);
}
}
v.push_back(s);
}
inline void dfs2(int s){
book[s]=1;
belong[s]=temp;
if(s>n&&belong[s-n]==temp||s<=n&&belong[n+s]==temp){
cout<<"IMPOSSIBLE";
exit(0);
}
for(register int i=head2[s];i;i=e2[i].next){
if(!book[e2[i].to]){
dfs2(e2[i].to);
}
}
}
inline void scc(){
for(register int i=1;i<=n*2;++i){
if(!book[i])
dfs1(i);
}
memset(book,0,sizeof(book));
for(register int i=v.size()-1;i>=0;--i){
if(!book[v[i]]){
++temp;
dfs2(v[i]);
}
}
}
int main(){
int m;
cin>>n>>m;
for(register int i=1;i<=m;++i){
int ti,a,tj,b;
cin>>ti>>a>>tj>>b;
add_edge(get_num(ti,a),get_num(tj,!b),1);
add_edge(get_num(tj,b),get_num(ti,!a),1);
add_edge(get_num(tj,!b),get_num(ti,a),0);
add_edge(get_num(ti,!a),get_num(tj,b),0);
}
scc();
for(register int i=1;i<=n;++i){
if(belong[i]==belong[i+n]){
cout<<"IMPOSSIBLE";
return 0;
}
}
cout<<"POSSIBLE"<<endl;
for(register int i=1;i<=n;++i){
if(belong[i]<belong[i+n]){
cout<<1<<" ";
}
else cout<<0<<" ";
}
return 0;
}
```
by LonelinessMan @ 2018-11-23 20:40:19
t4个点!
by LonelinessMan @ 2018-11-23 20:40:28