#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <sstream>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctime>
#include <cassert>
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
inline int read_int(){
int t=0;bool sign=false;char c=getchar();
while(!isdigit(c)){sign|=c=='-';c=getchar();}
while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
return sign?-t:t;
}
inline LL read_LL(){
LL t=0;bool sign=false;char c=getchar();
while(!isdigit(c)){sign|=c=='-';c=getchar();}
while(isdigit(c)){t=(t<<1)+(t<<3)+(c&15);c=getchar();}
return sign?-t:t;
}
inline char get_char(){
char c=getchar();
while(c==' '||c=='\n'||c=='\r')c=getchar();
return c;
}
inline void write(LL x){
register char c[21],len=0;
if(!x)return putchar('0'),void();
if(x<0)x=-x,putchar('-');
while(x)c[++len]=x%10,x/=10;
while(len)putchar(c[len--]+48);
}
inline void space(LL x){write(x),putchar(' ');}
inline void enter(LL x){write(x),putchar('\n');}
const int MAXN=1e5+5;
int a[MAXN],b[MAXN],cnt[MAXN];
struct Tree{
int lef[MAXN<<2],rig[MAXN<<2],w[MAXN<<2];
int (*merge)(int,int);
void Push_up(int k){w[k]=merge(w[k<<1],w[k<<1|1]);}
void build(int k,int L,int R){
lef[k]=L,rig[k]=R,w[k]=w[0];
if(L==R)
return;
int M=L+R>>1;
build(k<<1,L,M);
build(k<<1|1,M+1,R);
}
void build(int n,int w_0){
w[0]=w_0;
build(1,1,n);
}
void update(int k,int p,int v){
if(lef[k]==rig[k])
return w[k]=v,void();
int mid=lef[k]+rig[k]>>1;
if(p<=mid)
update(k<<1,p,v);
else
update(k<<1|1,p,v);
Push_up(k);
}
void update_2(int k,int p,int v){
if(lef[k]==rig[k])
return w[k]+=v,void();
int mid=lef[k]+rig[k]>>1;
if(p<=mid)
update_2(k<<1,p,v);
else
update_2(k<<1|1,p,v);
Push_up(k);
}
int query(int k,int L,int R){
if(L>R)
return w[0];
if(L<=lef[k]&&rig[k]<=R)
return w[k];
int mid=lef[k]+rig[k]>>1;
if(R<=mid)
return query(k<<1,L,R);
else if(L>mid)
return query(k<<1|1,L,R);
return merge(query(k<<1,L,R),query(k<<1|1,L,R));
}
}tree;
int Max(int a,int b){
return a>b?a:b;
}
int main()
{
int n=read_int(),k=read_int();
_for(i,0,n)
a[i]=read_int();
memcpy(b,a,sizeof(a));
sort(b,b+n);
int m=unique(b,b+n)-b;
_for(i,0,n)
a[i]=lower_bound(b,b+m,a[i])-b;
int lef=0,rig=0,tot=0,ans=0;
tree.merge=Max;
tree.build(m,0);
while(lef<n){
while(rig<n&&(tot<=(k+1))){
cnt[a[rig]]++;
if(cnt[a[rig]]==1)
tot++;
tree.update_2(1,a[rig]+1,1);
rig++;
}
if(tot>(k+1)){
rig--;
cnt[a[rig]]--;
tot--;
tree.update_2(1,a[rig]+1,-1);
}
ans=max(ans,tree.query(1,1,m));
cnt[a[lef]]--;
if(cnt[a[lef]]==0)
tot--;
tree.update_2(1,a[lef]+1,-1);
lef++;
}
enter(ans);
return 0;
}