//遷移：使う, 使わない (2通り)
//状態：dp(i)[val] = (先頭i個まで見て)最後に値valを使ったときの最大個数
//区間max, 1点更新を高速にできれば良い -> セグメントツリー
#include <iostream>
#include <algorithm>
#include <vector>
#include <atcoder/segtree>
using namespace std;
using namespace atcoder;

int op(int a, int b) { return max(a, b); }
int e() { return 0; }

int N, K;
vector<int> a;

int main() {
	int i;
	
	cin >> N >> K;
	vector<int> a(N);
	for (i = 0; i < N; i++) cin >> a[i];
	
	vector<int> zero(300001, 0);
	segtree<int, op, e> seg(zero);
	
	for (i = 0; i < N; i++) {
		int l = max(0, a[i] - K);
		int r = min(N, a[i] + K + 1);
		int maxLen = seg.prod(l, r);
		seg.set(a[i], maxLen + 1);
	}
	
	cout << seg.all_prod() << endl;
	return 0;
}