Problem p03841 (C++)

Buggy submission (status: Runtime Error):
#pragma region include
#include <iomanip>
#include <iostream>
#include <stdio.h>

#include <algorithm>
#include <cmath>
#include <complex>
#include <sstream>

#include <bitset>
#include <cstring>
#include <string>
#include <tuple>
#include <vector>

#include <complex>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>

#include <fstream>
#include <random>
// #include <time.h>
#include <ctime>
#pragma endregion // #include
/////////
#define REP(i, x, n) for (int i = x; i < n; ++i)
#define rep(i, n) REP(i, 0, n)
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion // typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9 + 7;
const LL LINF = (LL)1e18;
const double PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace ::std;

void solve() {
  int N;
  cin >> N;
  vector<vector<int>> X(N, vector<int>(2));
  for (int i = 0; i < N; ++i) {
    cin >> X[i][0];
    X[i][1] = i + 1;
  }
  sort(X.begin(), X.end());
  vector<int> ans(N * N, -1);
  vector<int> at(N + 1, N);
  int pos = 0;
  for (int i = 0; i < N; ++i) {
    int No = X[i][1];  // 対象の数
    int ter = X[i][0]; //[ter-1]まででNo個置く
    if (ans[ter - 1] != -1) {
      cout << "No" << endl;
      return;
    }
    ans[ter - 1] = No;
    int nokori = No - 1;
    for (; nokori && pos < ter - 1; ++pos) {
      if (ans[pos] == -1) {
        ans[pos] = No;
        --nokori;
      }
    }
    if (nokori) {
      cout << "No" << endl;
      return;
    }
    at[No] -= No; // 設置した数引く
  }
  // 余ってる数を設置する。
  for (int i = 0; i < N; ++i) {
    int No = X[i][1];        // 対象の数
    int ter = X[i][0];       //[ter-1]まででNo個置く
    while (ans[pos] != -1) { // WA
      ++pos;
    }
    if (pos < ter - 1) { // ter-1より前には置けない
      cout << "No" << endl;
      return;
    }
    for (; at[No] && pos < N * N; ++pos) {
      if (ans[pos] == -1) {
        ans[pos] = No;
        at[No]--;
      }
    }
    if (at[No]) { //
      cout << "No" << endl;
      return;
    }
  }
  cout << "Yes" << endl;
  for (int i = 0; i < N * N; ++i) {
    if (i)
      cout << ' ';
    cout << ans[i];
  }
  cout << endl;
}
#pragma region main
signed main(void) {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  std::cout << std::fixed; // 小数を10進数表示
  cout << setprecision(16); // 小数点以下の桁数を指定//coutとcerrで別

  solve();
}
#pragma endregion // main()


Fixed submission:
#pragma region include
#include <iomanip>
#include <iostream>
#include <stdio.h>

#include <algorithm>
#include <cmath>
#include <complex>
#include <sstream>

#include <bitset>
#include <cstring>
#include <string>
#include <tuple>
#include <vector>

#include <complex>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>

#include <fstream>
#include <random>
// #include <time.h>
#include <ctime>
#pragma endregion // #include
/////////
#define REP(i, x, n) for (int i = x; i < n; ++i)
#define rep(i, n) REP(i, 0, n)
/////////
#pragma region typedef
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#pragma endregion // typedef
////定数
const int INF = (int)1e9;
const LL MOD = (LL)1e9 + 7;
const LL LINF = (LL)1e18;
const double PI = acos(-1.0);
const double EPS = 1e-9;
/////////
using namespace ::std;

void solve() {
  int N;
  cin >> N;
  vector<vector<int>> X(N, vector<int>(2));
  for (int i = 0; i < N; ++i) {
    cin >> X[i][0];
    X[i][1] = i + 1;
  }
  sort(X.begin(), X.end());
  vector<int> ans(N * N, -1);
  vector<int> at(N + 1, N);
  int pos = 0;
  for (int i = 0; i < N; ++i) {
    int No = X[i][1];  // 対象の数
    int ter = X[i][0]; //[ter-1]まででNo個置く
    if (ans[ter - 1] != -1) {
      cout << "No" << endl;
      return;
    }
    ans[ter - 1] = No;
    int nokori = No - 1;
    for (; nokori && pos < ter - 1; ++pos) {
      if (ans[pos] == -1) {
        ans[pos] = No;
        --nokori;
      }
    }
    if (nokori) {
      cout << "No" << endl;
      return;
    }
    at[No] -= No; // 設置した数引く
  }
  // 余ってる数を設置する。
  for (int i = 0; i < N; ++i) {
    int No = X[i][1];                       // 対象の数
    int ter = X[i][0];                      //[ter-1]まででNo個置く
    while (pos < N * N && ans[pos] != -1) { // WA
      ++pos;
    }
    if (pos < ter - 1) { // ter-1より前には置けない
      cout << "No" << endl;
      return;
    }
    for (; at[No] && pos < N * N; ++pos) {
      if (ans[pos] == -1) {
        ans[pos] = No;
        at[No]--;
      }
    }
    if (at[No]) { //
      cout << "No" << endl;
      return;
    }
  }
  cout << "Yes" << endl;
  for (int i = 0; i < N * N; ++i) {
    if (i)
      cout << ' ';
    cout << ans[i];
  }
  cout << endl;
}
#pragma region main
signed main(void) {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  std::cout << std::fixed; // 小数を10進数表示
  cout << setprecision(16); // 小数点以下の桁数を指定//coutとcerrで別

  solve();
}
#pragma endregion // main()