# java
import java.util.*;
public class Main {
static int N = 50010;
static int[][] q = new int[N][2];
static int n;
static HashSet<Integer> row = new HashSet<>();
static HashSet<Integer> col = new HashSet<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 0; i < n; i ++){
q[i][0] = sc.nextInt();
q[i][1] = sc.nextInt();
}
System.out.println(dfs(0, 0) ? 1: 0);
}
public static boolean dfs(int u, int cnt){
if (cnt > 3) return false;
if (u == n) return true;
if (row.contains(q[u][1]) || col.contains(q[u][0])) return dfs(u + 1, cnt);
row.add(q[u][1]);
if (dfs(u + 1, cnt + 1)) return true;
row.remove(q[u][1]);
col.add(q[u][0]);
if (dfs(u + 1, cnt + 1)) return true;
col.remove(q[u][0]);
return false;
}
}
# python
# Segmentation Fault
import sys
sys.setrecursionlimit(10**8)
row, col = set(), set()
n = int(input())
def dfs(u, cnt):
if cnt > 3:
return 0
if u == n:
return 1
if q[u][1] in row or q[u][0] in col:
return dfs(u + 1, cnt)
row.add(q[u][1])
if dfs(u + 1, cnt + 1):
return 1
row.remove(q[u][1])
col.add(q[u][0])
if dfs(u + 1, cnt + 1):
return 1
col.remove(q[u][0])
return 0
def main():
global q
q = []
for _ in range(n):
q.append(list(map(int, input().split())))
print(dfs(0, 0))
main()