#include <bits/stdc++.h>
using namespace std;
long long tree[10000000 + 5];
void upd(long long node, long long st, long long en, long long ind,
         long long v) {
  if (st > en) {
    return;
  }
  if (st == en) {
    if (st == ind) tree[st] = max(tree[st], v);
    return;
  }
  long long m = (st + en) / 2ll;
  if (ind >= st && ind <= m) {
    upd(node * 2, st, m, ind, v);
  } else if (ind > m && ind <= en) {
    upd(node * 2 + 1, m + 1, en, ind, v);
  }
  tree[node] = max(tree[node], max(tree[node * 2 + 1], tree[node * 2]));
}
long long query(long long node, long long st, long long en, long long l,
                long long r) {
  if (st > en) {
    return 0;
  }
  if (st > r or en < l) {
    return 0;
  }
  if (st >= l && en <= r) {
    return tree[node];
  }
  long long m = (st + en) / 2ll;
  return max(tree[node * 2], tree[node * 2 + 1]);
}
int main() {
  long long n, k;
  cin >> n >> k;
  long long ans = 1;
  for (long long i = 1; i <= n; i++) {
    long long j;
    cin >> j;
    long long mi_e = max(0ll, j - k);
    long long ma_e = min(300000ll, j + k);
    long long sol = query(1, 0, 300000, mi_e, ma_e) + 1ll;
    ans = max(ans, sol);
    upd(1, 0, 300000, j, sol);
  }
  cout << ans;
}
