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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main() {
  int i, j, k;
  int flag = 0;
  int data[501];
  int necessary[501];
  int result[250001];
  int output[501];
  
  for (i = 0; i < 501; i++) {
    necessary[i] = 0;
  }
  for (i = 0; i < 250001; i++) {
    result[i] = 0;
  }

  int N;

  scanf("%d", &N);
  for (i = 1; i <= N; i++) {
    scanf(" %d", &data[i]);
  }

  for (i = 1; i < 501; i++) {
    output[i] = N;
  }

  int temp1, temp2, tempn;

  for (i = 1; i <= N; i++) {
    temp1 = 0;
    temp2 = 0;
    for (j = 1; j <= N; j++) {
      if (i == j) {
        temp1 += j - 1;
        temp2 += (N - j);
      }
      else if (data[j] < data[i]) {
        temp1 += j;
      } else {
        temp2 += (N - j + 1);
      }
    }
    if(temp1 > data[i]-1||temp2>(N*N-data[i])){
      flag = 1;
      break;
    }
    else {
      k = 1;
      while (output[i] > N-i+1  && data[i] > k) {
        if (result[k] == 0) {
          result[k] = i;
          output[i]--;
        }
        k++;
      }
      result[data[i]] = i;
      output[i]--;
    }
  }

  if (flag == 1) {
    printf("No\n");
  } else {
    printf("Yes\n");
    for (i = 1; i <= N; i++) {
      printf("%d\n", output[i]);
      k = output[i] + 1;
      while (output[i] > 0) {
        if (result[k] == 0) {
          result[k] = i;
          output[i]--;
        }
        k++;
      }
    }
    for (i = 1; i <= N * N; i++) {
      printf("%d ", result[i]);
    }
  }
  return 0;
}