For this Question: Given an array of N Books B[], where B[i] denotes the number of pages P in i'th book. Now you need to find the maximum number of distinct books (having a different number of pages) after removing K books from the array.The input line contains T, denoting the number of testcases. Each testcase contains two lines. First line contains N, number of books and K, number of books you need to remove. Second line contains N positive integers denoting the number of pages in ith book.

Constraints:
1 <= T <= 100
1 <= N <= 10^4
1 <= K <= N
1 <= B[i] <= 10^4You need to print the maximum number of distinct books.Sample Input:
2
7 3
5 7 5 5 1 2 2
6 4
1 2 3 4 5 6

Sample Output:
4
2

Explanation:
Testcase 1:
Remove 2 occurrences of books having 5 pages and 1 occurrence of book having 2 pages., I have written this Solution Code: import java.util.*;
import java.io.*;
class Main{
    static class Reader {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public Reader()
        {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public Reader(String file_name) throws IOException
        {
            din = new DataInputStream(
                new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public String readLine() throws IOException
        {
            byte[] buf = new byte[64];
            int cnt = 0, c;
            while ((c = read()) != -1) {
                if (c == '\n') {
                    if (cnt != 0) {
                        break;
                    }
                    else {
                        continue;
                    }
                }
                buf[cnt++] = (byte)c;
            }
            return new String(buf, 0, cnt);
        }

        public int nextInt() throws IOException
        {
            int ret = 0;
            byte c = read();
            while (c <= ' ') {
                c = read();
            }
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (neg)
                return -ret;
            return ret;
        }

        public long nextLong() throws IOException
        {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nextDouble() throws IOException
        {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();

            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (c == '.') {
                while ((c = read()) >= '0' && c <= '9') {
                    ret += (c - '0') / (div *= 10);
                }
            }

            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException
        {
            bytesRead = din.read(buffer, bufferPointer = 0,
                                 BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException
        {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException
        {
            if (din == null)
                return;
            din.close();
        }
    }
    public static void main(String[] args) throws IOException {
        Reader sc = new Reader();
        int t = sc.nextInt();
        while (t-->0) {
            HashMap<Integer,Integer> map = new HashMap<>();
            int n = sc.nextInt();
            int k = sc.nextInt();
            for (int i = 0; i < n; i++) {
                int v = sc.nextInt();
                map.put(v, map.getOrDefault(v, 0)+1);
            }
            int maxRemove = 0;
            for (Integer integer : map.keySet()) {
                maxRemove += map.get(integer) -1;
            }
            if (k<=maxRemove) {
                System.out.println(map.size());
            }else{
                System.out.println(map.size() - (k-maxRemove));
            }
        }
    }
}, In this Programming Language: Java, Now tell me if this Code is compilable or not?