import std.algorithm;
import std.array;
import std.conv;
import std.stdio;
import std.string;

immutable int NA = -1;

int [] solve (int [] x)
{
	int n = cast (int) (x.length);
	auto a = new int [n * n];
	a[] = NA;
	int [2] [] v;
	foreach (int i, c; x)
	{
		v ~= [c, i];
	}
	sort (v);
	int [] pos;
	int [] lo;
	int [] hi;
	foreach (int i, c; x)
	{
		a[c] = i;
		pos ~= c;
		lo ~= i;
		hi ~= n - i - 1;
	}

main_loop:
	foreach (i; 0..n * n)
	{
		if (a[i] != NA)
		{
			if (lo[a[i]] != 0)
			{
				return [];
			}
			continue;
		}

		foreach (j; 0..n)
		{
			int cur = v[j][1];
			if (pos[cur] < i)
			{
				continue;
			}
			if (lo[cur] == 0)
			{
				continue;
			}
			a[i] = cur;
			lo[cur] -= 1;
			continue main_loop;
		}

		foreach_reverse (j; 0..n)
		{
			int cur = v[j][1];
			if (pos[cur] > i)
			{
				continue;
			}
			if (hi[cur] == 0)
			{
				continue;
			}
			a[i] = cur;
			hi[cur] -= 1;
			continue main_loop;
		}

		return [];
	}

	return a;
}

void main ()
{
	int n;
	while (readf (" %s", &n) > 0)
	{
		readln;
		auto x = readln.split.map !(to !(int)).array;
		x[] -= 1;
		auto a = solve (x);
		if (a.empty)
		{
			writeln ("No");
		}
		else
		{
			writeln ("Yes");
			a[] += 1;
			writefln ("%(%s %)", a);
		}
	}
}
