#include using namespace std; struct Edge { int from, to; Edge(int f, int t) : from(f), to(t) {} }; using Edges = vector; using Graph = vector; vector tarjan(const Graph& g) { int n = g.size(), idx = 0, k = 0, s = 0; vectorord(n, -1), low(n), onS(n), cmp(n), stk(n); function dfs = [&](int v) { ord[v] = low[v] = idx++; stk[s++] = v; onS[v] = true; for (auto &e : g[v]) { int w = e.to; if (ord[w] == -1) { dfs(w); low[v] = min(low[v], low[w]); } else if (onS[w]) { low[v] = min(low[v], ord[w]); } } if (low[v] == ord[v]) { while (1) { int w = stk[--s]; onS[w] = false; cmp[w] = k; if (w == v)break; } ++k; } }; for (int v = 0; v> N >> M; vector L1(N), R1(N); vector L2(N), R2(N); for (int i = 0; i < N; i++) { cin >> L1[i] >> R1[i]; R2[i] = M - 1 - L1[i]; L2[i] = M - 1 - R1[i]; } Graph G(N * 2); for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { if (!(R1[i] < L1[j] || R1[j] < L1[i])) { G[i].push_back(Edge(i, N + j)); G[j].push_back(Edge(j, N + i)); } if (!(R1[i] < L2[j] || R2[j] < L1[i])) { G[i].push_back(Edge(i, j)); G[N + j].push_back(Edge(N + j, N + i)); } if (!(R2[i] < L1[j] || R1[j] < L2[i])) { G[N + i].push_back(Edge(N + i, N + j)); G[j].push_back(Edge(j, i)); } if (!(R2[i] < L2[j] || R2[j] < L2[i])) { G[N + i].push_back(Edge(N + i, j)); G[N + j].push_back(Edge(N + j, i)); } } } auto v = tarjan(G); bool res = true; for (int i = 0; i < N; i++) { if (v[i] == v[i + N]) { res = false; } } cout << (res ? "YES" : "NO") << endl; return 0; }