#include <bits/stdc++.h>
using namespace std;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
struct Segtree {
  int N;
  vector<int> data;
  const int DEFAULT = 0;
  Segtree(int n) {
    N = 1;
    while (N <= n) N *= 2;
    data.resize(2 * N - 1);
    for (int i = 0; i < 2 * N - 1; i++) {
      data[i] = DEFAULT;
    }
  }
  void update(int k, int a) {
    k += N - 1;
    data[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      data[k] = max(data[2 * k + 1], data[2 * k + 2]);
    }
  }
  int query(int a, int b) { return query(a, b, 0, 0, N); }
  int query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return DEFAULT;
    if (a <= l && r <= b) return data[k];
    int vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
    int vr = query(a, b, 2 * k + 2, (l + r) / 2, r);
    return max(vl, vr);
  }
  int a(int k) { return data[N + k - 1]; }
};
int main() {
  int N, K;
  cin >> N >> K;
  Segtree S(300010);
  for (int i = 0; i < N; i++) {
    int a;
    cin >> a;
    int now = S.query(max(a - K, 0), min(a + K + 1, 300000));
    S.update(a, now + 1);
  }
  cout << S.query(0, 300002);
  return 0;
}
