module main; // https://mayokoex.hatenablog.com/entry/2015/08/29/104223 より // 2次元グリッド、貪欲法 import std; int N, M; int[] L, R; alias P = Tuple!(int, "l", int, "r"); P[] walls; bool solve() { int l = 0, r = M - 1; foreach (p; walls) { if (p.l >= l) { if (p.r > r) return false; l = p.r + 1; } else if (M - p.l - 1 <= r) { if (M - p.r - 1 < l) return false; r = M - p.r - 2; } else return false; } return true; } void main() { // 入力 readln.chomp.formattedRead("%d %d", N, M); L = new int[](N), R = new int[](N); foreach (ref l, ref r; lockstep(L, R)) { readln.chomp.formattedRead("%d %d", l, r); if (l <= M - r - 1) walls ~= P(l, r); // 裏返したほうがブロックが左に寄るならば裏返す else walls ~= P(M - r - 1, M - l - 1); } // 答えの計算と出力 walls.sort; writeln(solve() ? "YES" : "NO"); }