Problem:
Score : 300 points

Problem Statement

Takahashi has N balls. Initially, an integer A_i is written on the i-th ball.

He would like to rewrite the integer on some balls so that there are at most K different integers written on the N balls.

Find the minimum number of balls that Takahashi needs to rewrite the integers on them.

Constraints

1 \leq K \leq N \leq 200000

1 \leq A_i \leq N

All input values are integers.

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 ... A_N

Output

Print the minimum number of balls that Takahashi needs to rewrite the integers on them.

Sample Input 1

5 2
1 1 2 2 5

Sample Output 1

1

For example, if we rewrite the integer on the fifth ball to 2, there are two different integers written on the balls: 1 and 2.
On the other hand, it is not possible to rewrite the integers on zero balls so that there are at most two different integers written on the balls, so we should print 1.

Sample Input 2

4 4
1 1 2 2

Sample Output 2

0

Already in the beginning, there are two different integers written on the balls, so we do not need to rewrite anything.

Sample Input 3

10 3
5 1 3 2 4 1 1 2 3 4

Sample Output 3

3

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
 
int main()
{
  int N, K, i, tmp, esc, size, ans;
  scanf("%d %d", &N, &K);

  // 配列初期化
  int A[N + 1];
  int B[N + 1];
  for (i = 0; i <= N; i++) {
    A[i] = 0;
    B[i] = -1;
  }

  // 配列の添字に入力された数字を入れてAを「その添字と等しい数字の個数」の配列にする
  for (i = 0; i < N; i++) {
    scanf("%d", &tmp);
    A[tmp]++;
  }

  // Bを次に小さい個数の添字を指す配列にする(ソートの代わり、配列を使ってリストもどきを作る)
  // ここは最悪計算量はO(N^2)だけど平均計算量はO(NlogN)になるので大丈夫
  for (i = 0; i <= N; i++) {
    tmp = 0;
    if (A[i] > 0) {
      while (B[tmp] >= 0 && (tmp == 0 || A[tmp] > A[i])) {
        tmp = B[tmp];
      }
      esc = B[tmp];
      B[tmp] = i;
      B[i] = esc;
    }
  }

  // Bが完成したら個数が大きい方からK個数えて、それより後ろの個数を足す
  size = 0;
  tmp = 0;
  ans = 0;
  while (B[tmp] >= 0) {
    tmp = B[tmp];
    if (++size > K) {
      ans += A[tmp];
    }
  }
  printf("%d", ans);
  return 0;
}