N, K = map(int, input().split())

BL = (300000).bit_length()
WIDTH = pow(2, BL)
BUFSIZE = pow(2, BL+1) - 1
BASE = BUFSIZE - WIDTH

# TODO: default value
buf = [0] * BUFSIZE

def update(i, x):
    i += BASE
    buf[i] = x
    i = (i-1) // 2
    while i >= 0:
        buf[i] = compare(buf[2*i+1], buf[2*i+2])
        i = (i-1) // 2

# [q_left, q_right]
def search(q_left, q_right):
    return _search(0, WIDTH, 0, q_left, q_right)

def _search(l, width, i, q_left, q_right):
    if q_right < l or l + width - 1 < q_left:
        return 0
    if q_left <= l and l + width - 1 <= q_right:
        return buf[i]
    nwidth = width // 2
    c1 = _search(l, nwidth, 2*i+1, q_left, q_right)
    c2 = _search(l+nwidth, nwidth, 2*i+2, q_left, q_right)
    return compare(c1, c2)

def compare(i1, i2):
    if i1 > i2:
        return i1
    else:
        return i2

for _ in range(N):
    a = int(input())
    maxlen = search(a-K, a+K)
    update(a, maxlen+1)
print(search(0, 300000))
