#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 1;
const int N = 6e5 + 7;
inline int ls(int p) { return p << 1; }
inline int rs(int p) { return p << 1 | 1; }
int n, k, a[maxn];
struct node {
  int l, r, pre;
} t[maxn];
void update(int pos, int v, int l, int r, int p) {
  t[p].l = l, t[p].r = r;
  if (l == r) {
    t[p].pre = v;
  }
  int mid = l + r >> 1;
  if (pos <= mid)
    update(pos, v, l, mid, ls(p));
  else
    update(pos, v, mid + 1, r, rs(p));
  t[p].pre = max(t[ls(p)].pre, t[rs(p)].pre);
}
int query(int x, int y, int p) {
  if (x <= t[p].l && y >= t[p].r) {
    return t[p].pre;
  }
  int mid = t[p].l + t[p].r >> 1;
  int ans = 0;
  if (x <= mid) ans = max(ans, query(x, y, ls(p)));
  if (y > mid) ans = max(ans, query(x, y, rs(p)));
  return ans;
}
int main() {
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    int res = query(max(a[i] - k, 0), a[i] + k, 1) + 1;
    ans = max(ans, res);
    update(a[i], res, 0, N, 1);
  }
  cout << ans << endl;
  return 0;
}
