class SegmentTree
  def initialize(n)
    @offset = 1 << n.bit_length
    @data = Array.new(@offset * 2, 0)
  end
  def _max(a,b); a > b ? a : b; end
  def max; @data[1]; end
  def update(x, v)
    @data[@offset + x] = v
    k = (@offset + x) / 2
    while k > 0
      @data[k] = _max(@data[2 * k], @data[2 * k + 1])
      k /= 2
    end
    v
  end
  def range_max(a, b, k = 1, l = 0, r = @offset)
    return 0 if b <= l || r <= a
    return @data[k] if a <= l && r <= b
    mid = (l + r) / 2
    return _max(range_max(a,b,2 * k, l, mid), range_max(a,b,2 * k + 1, mid, r))
  end
end
def max(a,b); a > b ? a : b; end
def min(a,b); a < b ? a : b; end
V_MAX = 300_100
N, K = gets.split.map(&:to_i)
st = SegmentTree.new(V_MAX)
A = N.times.map{ gets.to_i }
A.each do |a|
  v = st.range_max(max(0, a - K), min(a + K + 1,V_MAX))
  st.update(a, v + 1)
end
puts st.max

