#include <iostream>
using namespace std;
const int maxn=3e6+7;
struct node{
    int l,r,s;
}pre[maxn];
int n,k,mx,a[maxn];
void build(int k,int l,int r);
void update(int k,int l,int r);
int query(int k,int l,int r);
int main(){
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        mx=max(mx,a[i]);
    }
    build(1,0,mx);
    int now=0,ans=0;
    for(int i=1;i<=n;i++){
        now=query(1,max(0,a[i]-k),min(mx,a[i]+k))+1;
        ans=max(ans,now);
        update(1,now,now);
    }
    printf("%d\n",ans);
}

void build(int k,int l,int r){
    pre[k].l=l,pre[k].r=r,pre[k].s=0;
    if(l>=r) return;
    build(k*2,l,(l+r)/2);
    build(k*2+1,(l+r)/2+1,r);
}

void update(int k,int l,int r){
    if(l<=pre[k].l&&pre[k].r<=r){
        pre[k].s=l;
        return;
    }
    int mid=(pre[k].l+pre[k].r)/2;
    if(l<=mid) update(k*2,l,r);
    else(mid+1<=r) update(k*2+1,l,r);
    pre[k].s=max(pre[k*2].s,pre[k*2+1].s);
}

int query(int k,int l,int r){
    if(pre[k].l<=l&&pre[k].r<=r){
        return pre[k].s;
    }
    int mid=(pre[k].l+pre[k].r)/2;
    int ans1=0,ans2=0;
    if(l<=mid) ans1=query(k*2,l,r);
    if(mid+1<=r) ans2=query(k*2+1,l,r);
    return max(ans1,ans2);
}

