#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=6e5+10;
const int inf=2e9;
inline int read() {
int x=0, f=1; char c=getchar();
for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=0;
for(; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
return f?x:-x;
}
int a[maxn<<1];
int st[maxn];
int f[maxn], g[maxn], n, dep[maxn];
int suf[maxn];
inline void SOL() {
for(int i=1; i<=n; ++i) g[i]=f[i], f[i]=-inf;
int tp=1; st[1]=n;
suf[1]=0; dep[n]=1;
for(int i=n-1; i>0; --i) {
while(tp&&a[i]>a[st[tp]]) {
suf[tp-1]=max(suf[tp-1], suf[tp]+1);
--tp;
}
dep[i]=dep[st[tp]]+1;
f[i]=suf[tp]+dep[i];
st[++tp]=i; suf[tp]=max(suf[tp-1], g[i]-dep[i]);
}
l
///
}
int b[maxn];
inline void sol(int k) {
for(int i=1; i<=n; ++i) a[i]=a[i+n]=b[i];
for(int i=n+1; i<=n+n; ++i) if(a[i]==n) {
for(int j=1; j<=n; ++j) a[j]=a[j+i-n];
break;
}
int tp=1; st[1]=n; dep[n]=1;
for(int i=n-1; i>0; --i) {
while(tp&&a[i]>a[st[tp]]) --tp;
dep[i]=dep[nxt[i]]+1;
st[++tp]=i;
}
for(int i=1; i<=n; ++i) f[i]=dep[i];
for(int i=2; i<=k; ++i) SOL();
int ans=0;
for(int i=1; i<=n-k+1; ++i) ans=max(ans, f[i]);
return ans+1;
}
int main() {
n=read(); int k=read();
for(int i=1; i<=n; ++i) b[i]=read();
int ans=sol(k);
reverse(a+1, a+n+1);
ans=max(ans, sol(k));
printf("%d", ans);
return 0;
}