from math import sqrt,sin,cos,tan,ceil,radians,floor,gcd,exp,log,log10,log2,factorial,fsum from heapq import heapify, heappop, heappush from bisect import bisect_left, bisect_right from copy import deepcopy import copy import random from collections import deque,Counter,defaultdict from itertools import permutations,combinations from decimal import Decimal,ROUND_HALF_UP #tmp = Decimal(mid).quantize(Decimal('0'), rounding=ROUND_HALF_UP) from functools import lru_cache, reduce #@lru_cache(maxsize=None) from operator import add,sub,mul,xor,and_,or_,itemgetter INF = 10**18 mod1 = 10**9+7 mod2 = 998244353 #DecimalならPython #再帰ならPython!!!!!!!!!!!!!!!!!!!!!!!!!! def scc(N,edges): M=len(edges) start=[0]*(N+1) elist=[0]*M for e in edges: start[e[0]+1]+=1 for i in range(1,N+1): start[i]+=start[i-1] counter=start[:] for e in edges: elist[counter[e[0]]]=e[1] counter[e[0]]+=1 visited=[] low=[0]*N Ord=[-1]*N ids=[0]*N NG=[0,0] def dfs(v): stack=[(v,-1,0),(v,-1,1)] while stack: v,bef,t=stack.pop() if t: if bef!=-1 and Ord[v]!=-1: low[bef]=min(low[bef],Ord[v]) stack.pop() continue low[v]=NG[0] Ord[v]=NG[0] NG[0]+=1 visited.append(v) for i in range(start[v],start[v+1]): to=elist[i] if Ord[to]==-1: stack.append((to,v,0)) stack.append((to,v,1)) else: low[v]=min(low[v],Ord[to]) else: if low[v]==Ord[v]: while(True): u=visited.pop() Ord[u]=N ids[u]=NG[1] if u==v: break NG[1]+=1 low[bef]=min(low[bef],low[v]) for i in range(N): if Ord[i]==-1: dfs(i) for i in range(N): ids[i]=NG[1]-1-ids[i] group_num=NG[1] counts=[0]*group_num for x in ids: counts[x]+=1 groups=[[] for i in range(group_num)] for i in range(N): groups[ids[i]].append(i) return groups # edge = [(a,b)] ''' グラフっぽく考えられそう 最初と終わりさえ決めれば間は関係ない 全部を通って終わりまでたどりつけるか?という問題 sccして1個なら全部行ける 1個じゃなくて、パスがあったらその組はいける 入次数0から始める そこから全部通れるか サイクルはSCCで対処可能 ''' M = int(input()) lim = 2*(10**5)+1 G = [[] for _ in range(M+1)] lef = [[] for _ in range(lim)] rig = [[] for _ in range(lim)] hw = [] st = set() for i in range(1,M+1): h,w = map(int, input().split()) if (h,w) in st: continue st.add((h,w)) lef[h].append(i) rig[w].append(i) hw.append((h,w)) N = len(hw) memo = [0]*(N+1) edge = [] for i in range(1,N+1): h,w = hw[i-1] for j in lef[w]: G[i].append(j) edge.append((i,j)) memo[j] += 1 for j in rig[h]: G[j].append(i) edge.append((j,i)) memo[i] += 1 SCC = scc(N+1,edge) if len(SCC) == 2: print(N) else: Q = [] seen = [0]*(N+1) for i in range(1,N+1): if memo[i] == 0: Q.append(i) break while len(Q) > 0: pos = Q.pop() seen[pos] = 1 for nx in G[pos]: if seen[nx] == 1: continue Q.append(nx) break for i in range(1,N+1): if seen[i] == 0: print(0) break else: print(1)