# Input Part
N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]

Amax = max(A)
# 初期化
n = 1
while n < Amax:
    n *= 2
#print(n)
# セグメント木を持つグローバル配列
# すべての値をINT_MAXに 
INF = 0
dat = [INF] * (2*n-1)

#k番目の値(0-indexed)をaに変更
def update(k,a):
    # 葉の節点
    k += n - 1
    dat[k] = a
    # 登りながら更新
    while k > 0:
        k = int((k - 1) / 2)
        dat[k] = max(dat[k * 2 + 1], dat[k * 2 + 2])

# [a,b]の最小値を求める
# 後ろのほうの引数は、計算の簡単のための引数。
# kは節点の番号、1, rはその節点が[1, r)に対応づいていることを表す。
# したがって、外からはquery(a, b, 0, 0, n)として呼ぶ。
def query(a,b,k,l,r):
    # [a,b]と[1, r)が交差しなければ、INT_MAX
    if a==b:
        return dat[n+a-1]
    
    if r <= a or b <= l:
        return INF
    # [a, b]が[1, r]を完全に含んでいれば、この節点の値 
    if a <= l and r <= b:
        return dat[k]
    # そうでなければ、2つの子の最小値
    else:
        vl = query(a,b,k * 2 + 1,l, int((l + r) / 2))
        vr = query(a,b, k * 2 + 2, int((l + r) / 2), r)
    
    return max(vl,vr)

def main():
    for i in range(N):
        tmin = max(0,A[i]-K)
        tmax = min(Amax,A[i]+K)+1
        update(A[i],query(tmin,tmax,0,0,n)+1)
        #print(dat)
    print(dat[0])
main()
