import sys sys.setrecursionlimit(20000) from collections import deque # a-zに正方向と逆辺を張る def addEdge(g, a, z): g[0][a].append(z) g[1][z].append(a) # グラフの初期化 def initGraph(g, edgenum): g.append([]) # [0] 正方向のグラフ g.append([]) # [1] 逆方向のグラフ for _ in range(edgenum): g[0].append(deque(list())) for _ in range(edgenum): g[1].append(deque(list())) def dfs(g, v, visited, vs): # 正方向のDFS visited[v] = True for i in range(len(g[0][v])): if visited[g[0][v][i]] is False: dfs(g, g[0][v][i], visited, vs) vs.append(v) def rdfs(g, v, visited, cmp, k): # 逆方向のDFS # kがcall元に指定される連結成分の通し番号 visited[v] = True cmp[v] = k # 指定したノードの逆辺をたどる for i in range(len(g[1][v])): # print("go? {0}".format(g[1][v][i])) # 逆辺の先がrDFSで到達できないときのみ if visited[g[1][v][i]] is False: # print("yes") rdfs(g, g[1][v][i], visited, cmp, k) def scc(g, cmp): vs = [] # 帰りがけのリスト visited = [False] * len(g[0]) cmp.extend([None] * len(g[0])) for i in range(len(g[0])): if visited[i] is False: dfs(g, i, visited, vs) visited = [False] * len(g[1]) k = 0 # pprint(vs) for i in range(len(vs) - 1, -1, -1): # print("vited: i={0} vs[i] = {1}".format(i, vs[i])) # print(visited) if visited[vs[i]] is False: # print("rdfs [{0}]".format(i)) rdfs(g, vs[i], visited, cmp, k) k += 1 # pprint(vs) return k n, m = map(int, input().split()) dat = [] for _ in range(n): a,b = map(int, input().split()) dat.append((a,b)) vCount = n * 2 # 各xとnot x分で2倍 # 0-n-1が各要素のx, n - n*2-1がnot x の 領域 g = [] # グラフ。[0] = 正方向のグラフ。 [1] = 逆方向のグラフ v = [] # 辺 cmp = [] from pprint import pprint initGraph(g, edgenum=vCount) def isDup(a, b, c, d): if a < c and b < c: return True if a > c and b > c: return True return False for i in range(n): pi = i - 1 if pi > -1: if isDup(dat[i][0], dat[i][1], dat[pi][0], dat[pi][1]) is False: addEdge(g, n+i, n+pi) if isDup(m - dat[i][0], m-dat[i][1], dat[pi][0], dat[pi][1]) is False: addEdge(g, i, n+pi) if isDup(dat[i][0], dat[i][1], m-dat[pi][0], m-dat[pi][1]) is False: addEdge(g, n+i, pi) if isDup(m-dat[i][0], m-dat[i][1], m-dat[pi][0], m-dat[pi][1]) is False: addEdge(g, i, pi) pi = i + 1 if pi < n: if isDup(dat[i][0], dat[i][1], dat[pi][0], dat[pi][1]) is False: addEdge(g, n+i, n+pi) if isDup(m - dat[i][0], m-dat[i][1], dat[pi][0], dat[pi][1]) is False: addEdge(g, i, n+pi) if isDup(dat[i][0], dat[i][1], m-dat[pi][0], m-dat[pi][1]) is False: addEdge(g, n+i, pi) if isDup(m-dat[i][0], m-dat[i][1], m-dat[pi][0], m-dat[pi][1]) is False: addEdge(g, i, pi) k = scc(g, cmp) #print(cmp) f = True for i in range(n): if cmp[i] == cmp[n+i]: f = False break print("YES" if f else "NO")