#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#pragma GCC optimize("no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long N = 5e5 + 100, OO = 1e9 + 10, M = 1e9 + 7, P = 49157, sq = 360,
                lg = 30;
vector<pair<long long, long long> > res;
void make_edge(long long r1, long long c1, long long r2, long long c2,
               long long f) {
  f = (f + c1) % 2;
  for (long long i = c1; i < c2 + 1; i++) {
    if (f != i % 2)
      for (long long j = r1; j < r2 + 1; j++) res.push_back({j, i});
    else
      for (long long j = r2; j >= r1; j--) res.push_back({j, i});
  }
}
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  long long a, b, c, d, n;
  cin >> a >> b >> c >> d >> n;
  make_edge(0, 0, b - 1, a - 1, a % 2 + 1);
  make_edge(0, a, d - 1, a + c - 1, 1);
  vector<string> V(max(b, d), string(a + c, '.'));
  for (long long i = 0; i < n; i++) {
    long long x;
    cin >> x;
    while (x--) {
      V[res.back().first][res.back().second] = 'a' + i;
      res.pop_back();
    }
  }
  cout << "YES" << endl;
  for (long long i = 0; i < V.size(); i++) cout << V[i] << endl;
  return 0;
}
