You are given an array a consisting of n integer numbers.

You have to color this array in k colors in such a way that: 

  * Each element of the array should be colored in some color; 
  * For each i from 1 to k there should be at least one element colored in the i-th color in the array; 
  * For each i from 1 to k all elements colored in the i-th color should be distinct. 



Obviously, such coloring might be impossible. In this case, print "NO". Otherwise print "YES" and any coloring (i.e. numbers c_1, c_2, ... c_n, where 1 ≤ c_i ≤ k and c_i is the color of the i-th element of the given array) satisfying the conditions above. If there are multiple answers, you can print any.

Input

The first line of the input contains two integers n and k (1 ≤ k ≤ n ≤ 5000) — the length of the array a and the number of colors, respectively.

The second line of the input contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 5000) — elements of the array a.

Output

If there is no answer, print "NO". Otherwise print "YES" and any coloring (i.e. numbers c_1, c_2, ... c_n, where 1 ≤ c_i ≤ k and c_i is the color of the i-th element of the given array) satisfying the conditions described in the problem statement. If there are multiple answers, you can print any.

Examples

Input


4 2
1 2 2 3


Output


YES
1 1 2 2


Input


5 2
3 2 1 2 3


Output


YES
2 1 1 2 1


Input


5 2
2 1 1 2 1


Output


NO

Note

In the first example the answer 2~ 1~ 2~ 1 is also acceptable.

In the second example the answer 1~ 1~ 1~ 2~ 2 is also acceptable.

There exist other acceptable answers for both examples.
 
import java.io.*;
import java.security.AllPermission;
import java.util.*;
 
 
public class Main {
    public static void main(String[] args)  {
        __SolutionBase begin = new __SolutionBase();
        begin.Solve();
    }
}
class __SolutionBase {
 
    public void Solve() {
        init();
        Solution();
        out.close();
    }
    private void Solution() {
        int n = readInt();
        int k = readInt();
        int[] allNumbers = new int[5000];
        int[] numbers = new int[n];
        int[] answer = new int[n];
        for (int i = 0;i < n;i++) {
            numbers[i] = readInt() - 1;
            allNumbers[numbers[i]]++;
        }
        int count = 0;
        for (int i = 0;i < 5000;i++) count = Math.max(allNumbers[i],count);
        if (count > k ){
            out.println("NO");
            return;
        }
        Set<Integer>[] colors = new HashSet[k];
        for (int i = 0;i < k;i++) colors[i] = new HashSet<>();
/*
        allNumbers = new int[n];
        for (int i = 0;i < n;i++){
            answer[i] = allNumbers[numbers[i]] + 1;
            allNumbers[numbers[i]]++;
        }
*/
        int inputColor = 0;
        for (int i = 0;i < n;i++){
            while (true) {
                if (inputColor > k - 1)
                    inputColor = 0;
                if (!colors[inputColor].contains(numbers[i])) {
                    colors[inputColor].add(numbers[i]);
                    answer[i] = inputColor + 1;
                    inputColor++;
                    break;
                } else inputColor++;
            }
        }
 
        out.println("YES");
        for (int elem:answer){
            out.print(elem + " ");
        }
 
 
    }
 
    /**
     * readLong, readDouble and other are similar
     *
     * @return int type from input
     */
    private int readInt() {
        return Integer.parseInt(readString());
    }
 
    private long readLong() {
        return Long.parseLong(readString());
    }
    /**
     * Tokens are separated by space or endExclusive of line
     *
     * @return non-empty string token from input (or null if there is no any token)
     */
    private String readString() {
        while (!tok.hasMoreTokens()) {
            String nextLine = readLine();
            if (null == nextLine) return null;
            tok = new StringTokenizer(nextLine);
        }
 
        return tok.nextToken();
    }
 
    /**
     * @return whole line from input
     */
    private String readLine() {
        try {
            return in.readLine();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    private BufferedReader in;
    private PrintWriter out;
    private StringTokenizer tok = new StringTokenizer(" ");
 
    /**
     * For local testing I use pair 'input.txt'/'output.txt' in the project root
     */
    private void init() {
        try {
            in = new BufferedReader(new FileReader("input.txt"));
            out = new PrintWriter("output.txt");
        } catch (FileNotFoundException e) {
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(System.out);
        }
    }
}