原题传送门
#include <cstdio>
#include <iostream>
#include <algorithm>
#define int long long
#define N 500000
#define le p<<1
#define ri (p<<1)|1
using namespace std;
int n,d,ai[N],t[(N<<2)+10];
void up(int p){
t[p]=max(t[le],t[ri]);
}
void change(int p,int l,int r,int x,int k){
if(l==r&&l==x){
t[p]=max(t[p],k);
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(le,l,mid,x,k);
else change(ri,mid+1,r,x,k);
up(p);
}
int query(int p,int l,int r,int x,int y){
if(x<=l&&r<=y){
return t[p];
}
int mid=(l+r)>>1,mx=-1;
if(x<=mid) mx=max(mx,query(le,l,mid,x,y));
if(y>mid) mx=max(mx,query(ri,mid+1,r,x,y));
return mx;
}
signed main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>ai[i];
// maxn=max(maxn,ai[i]);
}
for(int i=1;i<=n;i++){
int l=ai[i]-d,r=ai[i]+d;
if(l<=0) l=1;
if(r>500000) r=500000;
change(1,1,N,ai[i],query(1,1,N,l,r)+1);
}
cout<<query(1,1,N,1,N)<<'\n';
return 0;
}