#include <bits/stdc++.h>
using namespace std;
long long A[500000];
long long tree[900000];
long long max(long long a, long long b) {
  if (a > b)
    return a;
  else
    return b;
}
long long min(long long a, long long b) {
  if (a < b)
    return a;
  else
    return b;
}
long long query(long long node, long long b, long long e, long long i,
                long long j) {
  if (b > j || i > e) return 0;
  if (i <= b && j >= e) return tree[node];
  long long left = node * 2;
  long long right = node * 2 + 1;
  long long mid = (b + e) / 2;
  long long p1 = query(left, b, mid, i, j);
  long long p2 = query(right, mid + 1, e, i, j);
  return max(p1, p2);
}
void update(long long node, long long b, long long e, long long i,
            long long x) {
  if (b > i || i > e) return;
  if (i <= b && i >= e) {
    tree[node] = x;
    return;
  }
  long long left = node * 2;
  long long right = node * 2 + 1;
  long long mid = (b + e) / 2;
  update(left, b, mid, i, x);
  update(right, mid + 1, e, i, x);
  tree[node] = max(tree[left], tree[right]);
}
long long dp[300000 + 4];
int main() {
  long long N, k, i, j;
  cin >> N >> k;
  long long ans = 0;
  for (i = 1; i <= N; i++) {
    cin >> A[i];
    long long l = max(0, A[i] - k);
    long long r = min(300000, A[i] + k);
    long long x = query(1, 0, 300000, l, A[i]);
    long long y = query(1, 0, 300000, A[i], r);
    dp[i] = max(x, y) + 1;
    ans = max(ans, dp[i]);
    update(1, 0, 300000, A[i], dp[i]);
  }
  cout << ans << endl;
  return 0;
}
