
// D - Flat Subsequence

#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;
const int INF = 2147483647;
// const ll INF = 9223372036854775807;
// const ll MOD = 1e9 + 7;

const int MAX_A = 300000;

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

int e() {
	return 0;
}

int main() {
	int N, K;
	cin >> N >> K;

	vector<int> A(N);

	for (int i=0; i<N; i++) {
		cin >> A[i];
	}

	segtree<int, op, e> dp(MAX_A + 1); // dp[k]: 最後に選んだ値がkのときの部分列の最大の長さ

	for (int i=0; i<N; i++) {
		int L = max(0, A[i] - K);
		int R = min(MAX_A, A[i] + K + 1);
		int m = dp.prod(L, R);
		dp.set(A[i], m + 1);
	}

	int ans = dp.all_prod();

	cout << ans << endl;

	return 0;
}