Problem: You are given an integer sequence x of length N. Determine if there exists an integer sequence a that satisfies all of the following conditions, and if it exists, construct an instance of a.

* a is N^2 in length, containing N copies of each of the integers 1, 2, ..., N.
* For each 1 ≤ i ≤ N, the i-th occurrence of the integer i from the left in a is the x_i-th element of a from the left.

Constraints

* 1 ≤ N ≤ 500
* 1 ≤ x_i ≤ N^2
* All x_i are distinct.

Input

The input is given from Standard Input in the following format:


N
x_1 x_2 ... x_N


Output

If there does not exist an integer sequence a that satisfies all the conditions, print `No`. If there does exist such an sequence a, print `Yes` in the first line, then print an instance of a in the second line, with spaces inbetween.

Examples

Input

3
1 5 9


Output

Yes
1 1 1 2 2 2 3 3 3


Input

2
4 1


Output

No

Solution (in JAVA):

Solution:
import java.io.PrintWriter;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		int N = sc.nextInt();
		long[] x = new long[N];
		for(int i=0; i<N; i++)
			x[i] = (sc.nextLong()-1)<<10 | (i+1);

		int[] ans = solve(N, x);
		
		if(ans==null) {
			pw.println("No");
		} else {
			pw.println("Yes");
			for(int i=0; i<N*N; i++)
				pw.print(ans[i] + (i==N*N-1 ? "\n" : " "));
		}
		sc.close();
		pw.close();
	}
	
	static int[] solve(int N, long[] x) {
		Arrays.sort(x);
		
		int[] ans = new int[N*N];
		int p = 0;
		for(int i=0; i<N; i++) {
			int idx = (int)(x[i]&((1<<10)-1));
			int pos = (int)(x[i]>>10);
			if(ans[pos]!=0)
				return null;
			ans[pos] = idx;
			for(int j=0; j<idx-1; j++) {
				while(ans[p]!=0)
					p++;
				if(p>pos)
					return null;
				ans[p] = idx;
			}
		}
		
		p = N*N-1;
		for(int i=N-1; i>=0; i--) {
			int idx = (int)(x[i]&((1<<10)-1));
			int pos = (int)(x[i]>>10);
			for(int j=0; j<N-idx; j++) {
				while(ans[p]!=0)
					p--;
				if(p<pos)
					return null;
				ans[p] = idx;
			}
		}
		
		return ans;
	}
}