#include <bits/stdc++.h>
using namespace std;
long long int max(long long int a, long long int b) {
  if (a > b) return a;
  return b;
}
long long int min(long long int a, long long int b) {
  if (a < b) return a;
  return b;
}
long long int ceil_div(long long int a, long long int b) {
  return (a + b - 1) / b;
}
const long long int N = 3e5 + 5, INF = 2e9 + 2, MOD = 998244353, M = 6000,
                    K = 20;
int a[2 * N], segment[4 * N], b[N];
void build(int ind, int l, int r) {
  if (r == l) return;
  if (r - l == 1) {
    segment[ind] = a[l];
    return;
  }
  int mid = (l + r) / 2;
  build(ind * 2, l, mid);
  build(ind * 2 + 1, mid, r);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}
void update(int ind, int l, int r, int i, int v) {
  int mid = (l + r) / 2;
  if (r - l == 1) {
    segment[ind] = v;
    return;
  }
  if (i < mid)
    update(2 * ind, l, mid, i, v);
  else
    update(2 * ind + 1, mid, r, i, v);
  segment[ind] = max(segment[2 * ind], segment[2 * ind + 1]);
}
int ql, qr;
long long int query(int ind, int l, int r) {
  int mid = (l + r) / 2;
  if (l >= ql && r <= qr) return segment[ind];
  if (r <= ql || l >= qr) return 0;
  long long int ans = 0;
  ans = max(query(2 * ind, l, mid), query(2 * ind + 1, mid, r));
  return ans;
}
int main() {
  cin.sync_with_stdio(false), cin.tie(NULL);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> b[i];
  a[b[0]] = 1;
  build(1, 0, 2 * N);
  long long int tp;
  for (int i = 1; i < n; i++) {
    ql = max(0, b[i] - k);
    qr = min(2 * N, b[i] + k + 1);
    tp = query(1, 0, 2 * N);
    a[b[i]] = tp + 1;
    update(1, 0, 2 * N, b[i], tp + 1);
  }
  cout << max(segment[1], *max_element(a, a + N)) << "\n";
  return 0;
}
