from collections import defaultdict, deque, Counter import copy from itertools import combinations, permutations, product, accumulate, groupby from heapq import heapify, heappop, heappush import math import bisect from pprint import pprint import sys # sys.setrecursionlimit(700000) input = lambda: sys.stdin.readline().rstrip('\n') inf = float('inf') mod1 = 10**9+7 mod2 = 998244353 def ceil_div(x, y): return -(-x//y) ################################################# def sccd(adj): n = len(adj) been = [False]*n P = [] for s in range(n): if been[s]: continue stack = [s] while stack: now = stack.pop() if now >= 0: if been[now]: continue been[now] = True stack.append(~now) for nxt in adj[now]: if been[nxt]: continue stack.append(nxt) else: P.append(~now) radj = [[] for _ in range(n)] for i, neighbor in enumerate(adj): for j in neighbor: radj[j].append(i) scc_prev = [] scc_idx = [None]*n for s in reversed(P): if not been[s]: continue been[s] = False stack = [s] scc = [] while stack: now = stack.pop() scc_idx[now] = (len(scc_prev), len(scc)) scc.append(now) for nxt in radj[now]: if not been[nxt]: continue been[nxt] = False stack.append(nxt) scc_prev.append(scc) scc_adj = [None]*len(scc_prev) for i, scc in enumerate(scc_prev): neighbor = set() for now in scc: for nxt in adj[now]: j = scc_idx[nxt][0] if j != i: neighbor.add(j) scc_adj[i] = list(neighbor) return scc_adj, scc_idx, scc_prev class Two_SAT: def __init__(self, n) -> None: self.n = n self.adj = [[] for _ in range(2*n)] def add(self, x, y): # 否定したいときは~xを入れる if x >= 0 and y >= 0: self.adj[self.n+x].append(y) self.adj[self.n+y].append(x) elif x >= 0: y = ~y self.adj[self.n+x].append(self.n+y) self.adj[y].append(x) elif y >= 0: x = ~x self.adj[x].append(y) self.adj[self.n+y].append(self.n+x) else: x = ~x; y = ~y self.adj[x].append(self.n+y) self.adj[y].append(self.n+x) def solve(self): _, scc_idx, _ = sccd(self.adj) ret = [False]*self.n for x in range(self.n): i, j = scc_idx[x][0], scc_idx[self.n+x][0] if i == j: return None ret[x] = i > j return ret def is_intersect(li, ri, lj, rj): if li > lj: li, ri, lj, rj = ri, rj, li, lj return lj <= ri N, M = map(int, input().split()) blocks = [tuple(map(int, input().split())) for _ in range(N)] sat = Two_SAT(N) for i in range(N): li, ri = blocks[i] for j in range(i+1, N): lj, rj = blocks[j] if is_intersect(li, ri, lj, rj): sat.add(~i, ~j) if is_intersect(li, ri, M-1-rj, M-1-lj): sat.add(~i, j) if is_intersect(M-1-ri, M-1-li, lj, rj): sat.add(i, ~j) if is_intersect(M-1-ri, M-1-li, M-1-rj, M-1-lj): sat.add(i, j) ans = sat.solve() print("YNEOS"[ans is None::2])