// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

#define all(v) ((v).begin()),((v).end())

#define ll long long

#define fastIO cout << fixed << setprecision(12), ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)

double const EPS = 1e-12, PI = acos(-1);

const int N = 2e5 + 9, M = 5e3 + 9, OO = 1e9 + 7, MOD = 1e9 + 7;

const ll inf = 1e18;



int freq[N];



int main() {

  fastIO;

#ifdef LOCAL

  freopen("input.in", "rt", stdin);

#endif

  int n, k, a;

  cin >> n >> k;

  vector<int> vec;

  for (int i = 0; i < n; ++i) {

    cin >> a;

    freq[a]++;

  }

  for (int i = 0; i < N; ++i) {

    if(freq[i])

      vec.push_back(freq[i]);

  }

  sort(vec.begin(), vec.end());

  ll total = 0;

  for (int i = 0; i < ((int)vec.size()) - k; ++i) {

    total += vec[i];

  }

  cout << total;

  return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.7638859828778741x):
/*

  Creator :  bizarre

*/

#include <bits/stdc++.h>

#include <math.h>

using namespace std;

#define bizarre  ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

#define file freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);

#define ll long long

#define ld long double

#define pi acos(-1)

#define point complex<double>

const int N = 1e5 + 9, inf = 1e18, mod = 1e9 + 7;

vector<int> prime_Numbers;

bool primes[1000005];

double dot(point a, point b)

{

    return (conj(a) * b).real();

}

double cross(point a, point b)

{

    return (conj(a) * b).imag();

}

/*

void prime(int n)

{

    primes[1]=primes[0]=0;

    for(int i=2; i<=n; i++)

        primes[i]=true;

    for(int i=2; i<=n; i++)

    {

        if(primes[i]==true)

        {

            prime_Numbers.push_back(i);

            for(int j=i+i; j<=n; j+=i)

                primes[j]=false;

        }

    }

}

void move1step(long long& a, long long& b, long long q)

{

    long long c= a-q*b;

    a=b;

    b=c;

}

long long egcd(long long r0,long long r1,long long& x0,long long& y0)

{

    long long x1=0,y1=1;

    x0=1;

    y0=0;

    while(r1)

    {

        long long q=r0/r1;

        move1step(r0,r1,q);

        move1step(x0,x1,q);

        move1step(y0,y1,q);

    }

    return r0;

}

bool  solve (long long a, long long b, long long c,long long&x, long long& y)

{

    long long g=egcd(a,b,x,y);

    int m=c/g;

    x*=m;

    y*=m;

    return c%g==0;

}

int gcd(int a, int b)

{

    if(b==0)

        return a;

    return gcd(b,a%b);

}

void PrimeFactorization(int n)

{

    for(int i=2; i*i<=n; i++)

    {

        int c=0;

        if(n%i==0)

        {

            while(n%i==0)

            {

                n/=i;

            }



        }

    }



}

long long ncrtane(long long n, long long r)

{

    long long ans=1,cntr=1;

    for(int i=n; i>n-r; i--)

    {

        ans*=i;

        ans/=cntr;

        cntr++;

    }

    return ans;

}

int ncr(long long n, long long r)

{

    return (((fact[n] * inv[n - r]) % mod) * inv[r]) % mod;

}



int npr(long long n, long long r)

{

    return (fact[n] * inv[n - r]) % mod;

}

long long fact[N], inv[N];

long long fp(long long base, long long exp)

{

    if (exp == 0)

        return 1;

    long long ans = fp(base, exp / 2);

    ans = (ans * ans) % mod;

    if (exp % 2 != 0)

        ans = (ans * (base % mod)) % mod;

    return ans;

}



void pre(long long n)

{

    fact[0] = 1;

    inv[0] = 1;

    for (long long i = 1; i <= n; i++)

    {

        fact[i] = (i * fact[i - 1]) % mod;

        inv[i] = fp(fact[i], mod - 2);

    }

}

*/

/*

ll lfts,lftw;

ll p,f,cnts,cntw,s,w;

ll ss(ll cnts, ll cntw, ll mxmp)

{

     for(int i = 0;i<=cnts;i++)

        {

            ll var = i*s,s = 0,e = cntw,mid,ans;

            if(var>p)break;

            while(s<=e)

            {

                mid = (s+e)/2;

                if((mid*w)+var<=p)ans = mid,s = mid+1;

                else e = mid-1;

            }

            if(mxmp<i+mid)mxmp = i+mid,lfts-=i,lftw-=mid;

        }

        return mxmp;

}

ll ww(ll cnts, ll cntw, ll mxmp)

{

    for(int i = 0;i<=cnts;i++)

        {

            ll var = i*s,s = 0,e = cntw,mid,ans;

            if(var>f)break;

            while(s<=e)

            {

                mid = (s+e)/2;

                if((mid*w)+var<=f)ans = mid,s = mid+1;

                else e = mid-1;

            }



            if(mxmp<i+mid)mxmp = i+mid;

        }

        return mxmp;

}

*/

int main()

{

    bizarre

    int n,k;

    cin >> n >> k;

    map<int,int>mp;

    for(int i = 0;i<n;i++)

    {

        int x;

        cin >> x;

        mp[x]++;

    }

    vector<int>v;

    for(auto it:mp)v.push_back(it.second);

        sort(v.begin(),v.end());

    reverse(v.begin(),v.end());

    ll sum =0;

    if(k>=v.size())return cout << 0,0;

    for(int i = 0;i<k;i++)

    {

        if(i<k)sum+=v[i];

    }

    cout << n - sum;

    return 0;

}