#include <bits/stdc++.h>
using namespace std;
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) {
  cerr << ' ' << H;
  dbg_out(T...);
}
const int N = 3 * 1e5 + 1;
int n, k;
struct segtree {
  vector<int> st;
  int n;
  int neutro = 0;
  segtree(int p) {
    n = p;
    st.assign(n * 4, 0);
    build(1, 0, n - 1);
  }
  void build(int p, int L, int R) {
    if (L == R)
      st[p] = 0;
    else {
      int m = (L + R) / 2, l = p * 2, r = l + 1;
      build(l, L, m);
      build(r, m + 1, R);
      st[p] = max(st[l], st[r]);
    }
  }
  int query(int i, int j) { return query(1, 0, n - 1, i, j); }
  void upd(int i, int j, int val) { upd(1, 0, n - 1, i, j, val); }
  int query(int p, int L, int R, int i, int j) {
    if (i > R || j < L) return neutro;
    if (i <= L && j >= R) return st[p];
    int m = (L + R) / 2, l = p * 2, r = l + 1;
    int lf = query(l, L, m, i, j);
    int rg = query(r, m + 1, R, i, j);
    return max(lf, rg);
  }
  void upd(int p, int L, int R, int i, int j, int val) {
    if (i > R || j < L) return;
    if (i <= L && j >= R)
      st[p] = val;
    else {
      int m = (L + R) / 2, l = p * 2, r = l + 1;
      upd(l, L, m, i, j, val);
      upd(r, m + 1, R, i, j, val);
      st[p] = max(st[l], st[r]);
    }
  }
};
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> k;
  int mx = 0;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    mx = max(mx, a[i]);
  }
  segtree st(mx + 1);
  for (int i = 0; i < n; i++) {
    st.upd(a[i], a[i], st.query(a[i] - k, a[i] + k + 1) + 1);
  }
  cout << (st.query(0, mx + 1)) << '\n';
  return 0;
}
