#include <bits/stdc++.h>
using namespace std;
long long tree[5000000];
void build(long long node, long long l, long long r) {
  if (l == r) {
    tree[node] = 0;
    return;
  }
  build(node * 2, l, (l + r) / 2);
  build(node * 2 + 1, (l + r) / 2 + 1, r);
  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
void update(long long node, long long l, long long r, long long i,
            long long x) {
  if (i < l || r < i) return;
  if (l == r) {
    tree[node] = x;
    return;
  }
  update(node * 2, l, (l + r) / 2, i, x);
  update(node * 2 + 1, (l + r) / 2 + 1, r, i, x);
  tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
long long query(long long node, long long l, long long r, long long i,
                long long j) {
  if (j < l || r < i) return 0;
  if (i <= l && r <= j) {
    return tree[node];
  }
  long long q1 = query(node * 2, l, (l + r) / 2, i, j);
  long long q2 = query(node * 2 + 1, (l + r) / 2 + 1, r, i, j);
  return max(q1, q2);
}
signed main() {
  std::ios::sync_with_stdio(false);
  long long T;
  T = 1;
  while (T--) {
    long long n, i, j, x, k, z;
    cin >> n >> k;
    long long ar[n + 1];
    for (i = 1; i <= n; ++i) {
      cin >> ar[i];
    }
    build(1, 0, 300000);
    for (i = 1; i <= n; ++i) {
      x = query(1, 0, 300000, max(0ll, x - k), min(300000ll, x + k));
      update(1, 0, 300000, ar[i], x + 1);
    }
    x = query(1, 0, 300000, 0, 300000);
    cout << x << endl;
  }
  return 0;
}
