#include<bits/stdc++.h>
using namespace std;
int bit[800005];
int sz;
void upd(int i, int v){
for(i++;i<=sz;i+=i&-i) bit[i]=max(bit[i],v);
}
int qry(int i){
int r=0;
for(i++;i>0;i-=i&-i) r=max(r,bit[i]);
return r;
}
int qry(int l,int r){
if(l>r) return 0;
// prefix max BIT doesn't support range queries directly
// use two prefix max queries won't work for range
// use segment tree instead
return 0;
}
struct Seg{
vector<int> t;
int n;
Seg(int n):n(n),t(2*n,0){}
void upd(int i,int v){for(t[i+=n]=max(t[i+n],v),i>>=1;i>=1;i>>=1)t[i]=max(t[2*i],t[2*i+1]);}
int qry(int l,int r){int res=0;for(l+=n,r+=n+1;l<r;l>>=1,r>>=1){if(l&1)res=max(res,t[l++]);if(r&1)res=max(res,t[--r]);}return res;}
};
int main(){
int n,m;
cin>>n>>m;
vector<int> a(n);
for(auto& x:a) cin>>x;
vector<int> vals=a;
vals.push_back(0);
sort(vals.begin(),vals.end());
vals.erase(unique(vals.begin(),vals.end()),vals.end());
int sz=vals.size();
auto getIdx=[&](int v){return (int)(lower_bound(vals.begin(),vals.end(),v)-vals.begin());};
Seg seg(sz);
// height 0 is available (starting point, not a pole)
seg.upd(getIdx(0),0);
int best=0;
for(int i=0;i<n;i++){
int lo=a[i]-m;
int li=0;
if(lo>0) li=(int)(lower_bound(vals.begin(),vals.end(),lo)-vals.begin());
int ri=getIdx(a[i]);
int prev=seg.qry(li,ri);
int cur=prev+1;
best=max(best,cur);
seg.upd(ri,cur);
}
cout<<n-best<<"\n";
}