bool dfs(int x) {
if(vis[x^1]) return 0;
if(vis[x]) return 1;
vis[x]=1;
S[c++]=x;
for(int i=0;i<edge[x].size();i++) {
if(!dfs(edge[x][i])) return 0;
}
return 1;
}
bool solve() {
for(int i=0;i<n*2;i+=2) {
if(!vis[i] && !vis[i+1]) {
c=0;
if(!dfs(i)) {
while(c>0) vis[S[--c]]=0;
if(!dfs(i+1)) return 0;
}
}
}
return 1;
}
if(vis[x^1]) return 0;
if(vis[x]) return 1;
vis[x]=1;
S[c++]=x;
for(int i=0;i<edge[x].size();i++) {
if(!dfs(edge[x][i])) return 0;
}
return 1;
}
bool solve() {
for(int i=0;i<n*2;i+=2) {
if(!vis[i] && !vis[i+1]) {
c=0;
if(!dfs(i)) {
while(c>0) vis[S[--c]]=0;
if(!dfs(i+1)) return 0;
}
}
}
return 1;
}