#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
using namespace std;
const int N=100001;
int n,m,ans;
int a[N],nex[N];
map<int,int>H;
//用于求nex[]和值存在标记
priority_queue< pair<int,int> >Q;
//用于每次贪心取最远值
inline void reade(int& rer){
register char ch;
for(ch=0;ch<'0'||ch>'9';ch=getchar());
for(rer=0;ch>='0'&&ch<='9';ch=getchar())
rer=(rer<<3)+(rer<<1)+(ch^48);
}
int main(){
register int i,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)reade(a[i]);
//输入a[]
for(i=1;i<=n;++i)nex[i]=n+i;
for(i=1;i<=n;++i){
if(k=H[a[i]])nex[k]=i;
H[a[i]]=i;
}H.clear();
//预处理求邻值位置nex[]
for(i=1;Q.size()<m&&i<=n;++i){
if(H[a[i]])continue;
H[a[i]]=1,++ans;
Q.push({nex[i],i});
}//先填满Cache
for(i=i;i<=n;++i){
if(H[a[i]]){
Q.push({nex[i],i});
continue;
}++ans;//存在则继续
do k=Q.top().second,Q.pop();
while(!H[a[k]]);
H.erase(a[k]),H[a[i]]=1;
Q.push({nex[i],i});
//否则弹出再弹入,同时标记
}//后续处理
printf("%d",ans);
return 0;
}
错数据点4,5,6;