#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;

using S = int64_t;
using F = int64_t;

const S INF = 8e18;
const F ID = 8e18;

S op(S a, S b) { return std::max(a, b); }
S e() { return -INF; }
S mapping(F f, S x) { return (f == ID ? x : f); }
F composition(F f, F g) { return (f == ID ? g : f); }
F id() { return ID; }

const int64_t SZ = 300000 + 2;
int main() {
    int n, k;
    cin >> n >> k;
    std::vector<S> v(SZ);
    // 1点更新、区間最大値なので遅延ではないセグ木で十分だが、
    // 勉強のため遅延セグ木を用いる。
    atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(v);

    while (n--) {
        int64_t x;
        cin >> x;
        // 過去に存在した x±k の座標に対する点の数の最大値を求める
        int64_t me = seg.prod(max(0LL, x - k), min(SZ, x + k + 1));
        // 現在のx座標に対して上記+1をセット（区間更新）
        seg.apply(x, x + 1, me + 1);
    }
    cout << seg.all_prod() << endl;
}
