Problem:
Score : 800 points

Problem Statement

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.

Sample Input 1

3
1 5 9

Sample Output 1

Yes
1 1 1 2 2 2 3 3 3

For example, the second occurrence of the integer 2 from the left in a in the output is the fifth element of a from the left.
Similarly, the condition is satisfied for the integers 1 and 3.

Sample Input 2

2
4 1

Sample Output 2

No

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

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <random>
#include <iomanip>
#include <functional>
#include <cassert>
#include <bitset>
 
using namespace std;
 
typedef long long ll;

int main() {
  ios_base::sync_with_stdio(false); cin.tie(0);
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
#endif  
  int n;
  cin >> n;
  vector <int> x(n);
  for (int i = 0; i < n; ++i) cin >> x[i];
  vector <int> p(n);
  iota(p.begin(), p.end(), 0);
  sort(p.begin(), p.end(), [&] (int i, int j) {
    return x[i] < x[j];
  });
  vector <int> ans;
  vector <int> used(n);
  vector <int> have(n);
  for (int id : p) {

    for (int i : p) {
      while (ans.size() + 1 < x[id] && (!used[i] && have[i] < i)) {
        ++have[i];
        ans.push_back(i + 1);
      }
    }
    for (int i : p) {
      while (ans.size() + 1 < x[id] && (used[i] && have[i] != n)) {
        ++have[i];
        ans.push_back(i + 1);
      }
    }

    ans.push_back(id + 1);
    ++have[id];
    used[id] = 1;
    if (ans.size() != x[id] || have[id] != id + 1) {
      cout << "No\n";
      return 0;
    }
  } 
  cout << "Yes\n";
  for (int x : ans) cout << x << ' ';
}