#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000;
template <typename T>
struct segment_tree {
  int N;
  vector<T> ST;
  segment_tree(int n) {
    N = 1;
    while (N < n) {
      N *= 2;
    }
    ST = vector<T>(N * 2 - 1, -INF);
  }
  T operator[](int k) { return ST[N - 1 + k]; }
  void update(int k, T x) {
    k += N - 1;
    ST[k] = x;
    while (k > 0) {
      k = (k - 1) / 2;
      ST[k] = max(ST[k * 2 + 1], ST[k * 2 + 2]);
    }
  }
  T query(int L, int R, int i, int l, int r) {
    if (R <= l || r <= L) {
      return -INF;
    } else if (L <= l && r <= R) {
      return ST[i];
    } else {
      int m = (l + r) / 2;
      return max(query(L, R, i * 2 + 1, l, m), query(L, R, i * 2 + 2, m, r));
    }
  }
  T query(int L, int R) { return query(L, R, 0, 0, N); }
  T all() { return ST[0]; }
};
int main() {
  int N, K;
  cin >> N >> K;
  vector<int> A(N);
  for (int i = 0; i < N; i++) {
    cin >> A[i];
  }
  segment_tree<int> ST(300001);
  ST.update(A[0], 1);
  for (int i = 1; i < N; i++) {
    int L = max(0, A[i] - K);
    int R = min(300001, A[i] + K + 1);
    ST.update(A[i], ST.query(L, R) + 1);
  }
  cout << ST.all() << endl;
}
