#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
/*---------------------DEBUGGING--------------------------------------------*/
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
/*-------------------------------------------------------------------------------------*/
//#define mp make_pair
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define pcc pair<char,char>
#define F first
#define S second
#define int long long
#define pi 3.141592653589793238462643383279502
#define M  1000000007 //998244353
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 100000000000000000
#define N 600005
#define vi vector<int>
#define all(v) v.begin(),v.end()
#define endl "\n"
//#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
struct item
{
    int m;
};

struct SegTree
{

    item tree[4*N];
    item merge(item a,item b)
    {
        return {max(a.m,b.m)};
    }
    void build(vector<int>&a,int node,int start,int end)
    {
        if(start == end)
        {
            tree[node].m=a[start];
            return;
        }
        int mid=(start + end)>>1;
        build(a,2*node+1,start,mid);
        build(a,2*node+2,mid+1,end);
        tree[node]=merge(tree[2*node + 1],tree[2*node + 2]);
    }
    void update(vector<int>&a,int node,int start,int end,int idx,int val1)
    {
        if(start == end)
        {
            tree[node].m=val1;
            return;
        }
        int mid=(start + end)>>1;
        if(start<=idx && idx<=mid)
            update(a,2*node+1,start,mid,idx,val1);
        else if(mid<idx && idx<=end)
            update(a,2*node+2,mid+1,end,idx,val1);
        tree[node]=merge(tree[2*node + 1],tree[2*node + 2]);
    }
    item query(int node,int start,int end,int l,int r)
    {
        if(r < start || end < l)
    {
        return {0};
    }
    if(l <= start && end <= r)
    {
        return tree[node];
    }
    int mid = (start + end) / 2;
    item p1 = query(2*node+1, start, mid, l, r);
    item p2 = query(2*node+2, mid+1, end, l, r);
    return merge(p1,p2);
    }
}st;
signed main()
{
   ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
   vi a(N+1);
   st.build(a,0,0,N+1);
   int n,k;
   cin>>n>>k;
   for(int i=0;i<n;i++)
   {   int x;
       cin>>x;
       int l=max(0LL,x-k);
       int r=x+k;
       int mx=st.query(0,0,N,l,r).m;
       a[x]=max(a[x],mx+1LL);
       st.update(a,0,0,N,x,a[x]);
   }
   int mx=0;
   for(int i=0;i<N;i++)mx=max(mx,a[i]);
   cout<<mx<<endl;
}


Measured memory_bytes: 24272