#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const long long mod = 998244353;
const long long maxn = 3e5 + 10, lg = 20;
long long n, k, ans;
long long dp[maxn], a[maxn], node[maxn], tree[maxn * 20];
void build(long long v, long long l, long long r) {
  if (l == r) {
    tree[v] = 0;
    node[l] = v;
  } else {
    long long med = (l + r) / 2;
    build(2 * v, l, med);
    build(2 * v + 1, med + 1, r);
    tree[v] = max(tree[2 * v], tree[2 * v + 1]);
  }
}
void update(long long v) {
  tree[v] = max(tree[2 * v], tree[2 * v + 1]);
  if (v != 1) {
    update((int)v / 2);
  }
}
long long get(long long v, long long l, long long r, long long lq,
              long long rq) {
  if (lq > rq) {
    return 0ll;
  } else if (lq == l && rq == r) {
    return tree[v];
  } else {
    long long med = (l + r) / 2;
    return max(get(2 * v, l, med, lq, min(rq, med)),
               get(2 * v + 1, med + 1, r, max(med + 1, lq), rq));
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  build(1, 1, n);
  for (int i = 1; i <= n; i++) {
    dp[a[i]] = max(
        dp[a[i]],
        (long long)get(1, 1, n, max(a[i] - k, 1ll), min(a[i] + k, n)) + 1ll);
    tree[node[a[i]]] = dp[a[i]];
    update((int)node[a[i]] / 2);
  }
  for (int i = 0; i <= maxn; i++) {
    ans = max(ans, dp[i]);
  }
  cout << ans << endl;
}
