import sys
import math
import itertools
from bisect import bisect_left, bisect_right, insort_left
from collections import deque, defaultdict
from heapq import heapify, heappush, heappop #最小値の選定の計算量O(logN)
from functools import lru_cache
from atcoder import modint, _math
from atcoder.string import z_algorithm
from atcoder.segtree import SegTree
from atcoder.lazysegtree import LazySegTree
sys.setrecursionlimit(10**7)
INF = 10**18
MOD = 998244353
#Asopy = [a[:] for a in A]
#after = sorted(before, key=lambda x: x[1])
# int input
ii = lambda: int(input())
# map int input
mii = lambda: map(int, input().split())
# list map int input
lmii = lambda: list(mii())
# list int input
lii = lambda x: [ii() for _ in range(x)]
# list list int input
llii = lambda x: [lmii() for _ in range(x)]
# string input
si = lambda: input()
# map string input
msi = lambda: map(str, input().split())
# map string input
lmsi = lambda: list(msi())
# list string input
lsi = lambda x: [si() for _ in range(x)]
# list list string input
llsi = lambda x: [lmsi() for _ in range(x)]
# list string atoi input
lsai = lambda : list(map(lambda c: ord(c)-ord('a'), input()))
def pyn(ans):
if ans:
print("Yes")
else:
print("No")
def pisINF(ans):
if ans in [INF, -INF]:
print(-1)
else:
print(ans)
#A
'''W, B = mii()
ans = W*1000//B+1
print(ans)'''
#B
'''N, M = mii()
AB = llii(N)
s = [[0, 0] for _ in range(M)]
for a, b in AB:
s[a-1][0] += b
s[a-1][1] += 1
ans = []
for su, cn in s:
ans.append(su/cn)
print(*ans, sep="\n")'''
#C
def f(N, H, tlu):
tlu = [[0, H, H]]+tlu
hrange = [H, H]
for i in range(N):
n = tlu[i+1]
dt = n[0]-tlu[i][0]
hrange = [max(hrange[0]-dt, n[1]), min(hrange[1]+dt, n[2])]
if hrange[0]>hrange[1]:
return "No"
return "Yes"
ans = []
T = ii()
for _ in range(T):
N, H = mii()
tlu = llii(N)
ans.append(f(N, H, tlu))
print(*ans, sep="\n")
#D
#E
#F