#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "financial"
const int N = 3e5+5;
int a[N];
pair<int,int> arr[N];
int n,D;
struct node{
int pref,suf,mx,len;
}st[4*N],emp;
struct segtree{
void merg(node &res,node &lef,node &rig){
if(lef.pref == 1e9){
res=rig;
return;
}
if(rig.pref == 1e9){
res=lef;
return;
}
if(lef.pref == lef.len) res.pref=rig.pref+lef.pref;
else res.pref=lef.pref;
if(rig.suf == rig.len) res.suf=rig.suf+lef.suf;
else res.suf=rig.suf;
res.mx=max(lef.mx,rig.mx);
res.mx=max(res.mx,lef.suf+rig.pref);
res.len=lef.len+rig.len;
}
void build(int id,int l,int r){
if(l==r){
st[id].len=1;
st[id].pref=st[id].suf=1;
st[id].mx=1;
return;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
merg(st[id],st[id<<1],st[id<<1|1]);
}
void update(int id,int l,int r,int p){
if(l==r){
st[id].len=1;
st[id].mx=0;
st[id].pref=st[id].suf=0;
return;
}
int mid=(l+r)>>1;
if(mid<p) update(id<<1|1,mid+1,r,p);
else update(id<<1,l,mid,p);
merg(st[id],st[id<<1],st[id<<1|1]);
}
node get(int id,int l,int r,int u,int v){
if(r<u || v<l) return emp;
if(u<=l && r<=v) return st[id];
int mid=(l+r)>>1;
node lef=get(id<<1,l,mid,u,v);
node rig=get(id<<1|1,mid+1,r,u,v);
node res;
merg(res,lef,rig);
return res;
}
}ste;
struct seg{
int st[4*N];
void update(int id,int l,int r,int p,int val){
if(l==r){
st[id]=val;
return;
}
int mid=(l+r)>>1;
if(mid<p) update(id<<1|1,mid+1,r,p,val);
else update(id<<1,l,mid,p,val);
st[id]=max(st[id<<1],st[id<<1|1]);
}
int get(int id,int l,int r,int u,int v){
if(r<u || v<l) return 0;
if(u<=l && r<=v) return st[id];
int mid=(l+r)>>1;
return max(get(id<<1,l,mid,u,v),get(id<<1|1,mid+1,r,u,v));
}
}stt;
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n>>D;
for(int i=1;i<=n;i++){
cin>>a[i];
arr[i]={a[i],i};
}
sort(arr+1,arr+1+n,[&](pair<int,int> a,pair<int,int> b){
if(a.fi == b.fi) return a.se > b.se;
return a.fi < b.fi;
});
emp.pref=1e9;
ste.build(1,1,n);
int answer=0;
for(int i=1;i<=n;i++){
int p=arr[i].se;
ste.update(1,1,n,p);
int l=1,r=p,ans=r;
while(l<=r){
int mid=(l+r)>>1;
node res=ste.get(1,1,n,mid,p);
if(res.mx+1 > D){
l=mid+1;
}else{
ans=mid;
r=mid-1;
}
}
int res=1+stt.get(1,1,n,ans,p);
//cerr<<p<<' '<<res<<'\n';
stt.update(1,1,n,p,res);
answer=max(answer,res);
}
cout<<answer<<'\n';
}