#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  return os << "{" << p.first << "," << p.second << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "{";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const map<T1, T2>& mp) {
  os << "{";
  for (auto it = mp.begin(); it != mp.end(); ++it) {
    if (it != mp.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& s) {
  os << "{";
  for (auto it = s.begin(); it != s.end(); ++it) {
    if (it != s.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const unordered_set<T>& s) {
  os << "{";
  for (auto it = s.begin(); it != s.end(); ++it) {
    if (it != s.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const multiset<T>& s) {
  os << "{";
  for (auto it = s.begin(); it != s.end(); ++it) {
    if (it != s.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <size_t N>
ostream& operator<<(ostream& os, const bitset<N>& bs) {
  os << "{";
  for (size_t i = 0; i < N; ++i) {
    cout << bs[i];
  }
  return os << "}";
}
template <typename T>
void _dbg(char const* s, const T& t) {
  cout << s << "=" << t << endl;
}
template <typename T, size_t N, typename... TA>
void _dbg(char const* s, const T& t, const TA&... ta) {
  while (*s != ',') cout << *s++;
  cout << "=" << t << ",";
  _dbg(s + 1, ta...);
}
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pss = pair<string, string>;
using pll = pair<ll, ll>;
using pdd = pair<ld, ld>;
int gcd(ll a, ll b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
int n, m, d;
deque<pair<int, int>> deq;
int check() {
  int pos = deq.back().first + deq.back().second - 1;
  if ((pos + d) >= n + 1)
    return 1;
  else
    return 0;
}
void solve() {
  deq.clear();
  deq.push_back({0, 1});
  cin >> n >> m >> d;
  for (int i = 0; i < m; ++i) {
    int x;
    cin >> x;
    deq.push_back({deq.back().first + deq.back().second, x});
  }
  int lst = deq.size() - 1;
  while (true) {
    int x = check();
    if (x == 0) {
      if (lst == 0) {
        cout << "NO";
        return;
      }
      for (int i = lst; i < deq.size(); ++i) {
        deq[i].first = deq[i - 1].first + deq[i - 1].second - 1 + d;
      }
      --lst;
      continue;
    }
    cout << "YES\n";
    vector<int> ans(n + 1);
    for (int i = 1; i < deq.size(); ++i) {
      for (int j = 0; j < deq[i].second; ++j) {
        ans[deq[i].first + j] = i;
      }
    }
    for (int i = 1; i < ans.size(); ++i) cout << ans[i] << " ";
    cout << endl;
    return;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  solve();
  return 0;
}
