#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3005;
const long long INF = 1e9;
int m, n, scores[MAXN];
int sum = 0;
int source = 0, sink;
int cap[MAXN][MAXN];
int N;
int h[MAXN];
queue<int> frontier;
bool visited[MAXN];
int a[MAXN], d[MAXN], q[MAXN];
int ptr[MAXN];
bool bfs(int source, int sink) {
  memset(d, 63, sizeof(d));
  d[sink] = 0;
  int h = 0, t = 0;
  q[t++] = sink;
  while (h < t) {
    int v = q[h++];
    for (int u = 0; u < N; u++)
      if (cap[u][v] > 0 && d[u] > d[v] + 1) {
        d[u] = d[v] + 1;
        q[t++] = u;
      }
  }
  return (d[source] < MAXN);
}
int dfs(int v, int sink, int f) {
  if (f == 0 || v == sink) return f;
  int ans = 0;
  for (; ptr[v] < N; ptr[v]++) {
    int u = ptr[v];
    if (cap[v][u] > 0 && d[v] == d[u] + 1) {
      int x = dfs(u, sink, min(f, cap[v][u]));
      ans += x;
      f -= x;
      cap[v][u] -= x;
      cap[u][v] += x;
      if (!f) break;
    }
  }
  return ans;
}
int maxflow(int source, int sink) {
  int f = 0, x;
  while (bfs(source, sink)) {
    int x;
    memset(ptr, 0, sizeof(ptr));
    while (x = dfs(source, sink, 2)) f += x;
  }
  return f;
}
int main() {
  scanf("%d%d", &n, &m);
  sum = n * (n - 1);
  for (int i = 0; i < m; ++i) {
    scanf("%d", scores + i);
    sum -= scores[i];
  }
  if (n == m && sum != 0) {
    cout << "no\n";
    return 0;
  }
  if (sum < 0) {
    cout << "no\n";
    return 0;
  }
  if (n != m) {
    int k = n - m;
    int ct1 = sum % k, ct2 = k - sum % k;
    if (sum / k > scores[m - 1]) {
      cout << "no\n";
      return 0;
    }
    if (ct1 > 0 && (sum / k) + 1 > scores[m - 1]) {
      cout << "no\n";
      return 0;
    }
    for (int i = m; i < m + ct1; ++i) scores[i] = sum / k + 1;
    for (int i = m + ct1; i < n; ++i) scores[i] = sum / k;
  }
  sink = n + 1, N = n + 2;
  long long sum2 = 0;
  for (int i = 1; i < N - 1; ++i)
    for (int j = i + 1; j < N - 1; ++j) cap[i][j] = 2;
  for (int i = 1; i < N - 1; ++i) {
    if (scores[i - 1] < 2 * (n - i))
      cap[0][i] = (2 * (n - i) - scores[i - 1]),
      sum2 += 2 * (n - i) - scores[i - 1];
    else
      cap[i][sink] = scores[i - 1] - 2 * (n - i);
  }
  if (maxflow(source, sink) != sum2) {
    cout << "no\n";
    return 0;
  }
  printf("yes\n");
  for (int i = 1; i < N - 1; ++i) {
    for (int j = 1; j < N - 1; ++j) {
      if (i == j) {
        printf("X");
        continue;
      }
      if (cap[i][j] == 0) printf("L");
      if (cap[i][j] == 1) printf("D");
      if (cap[i][j] == 2) printf("W");
    }
    printf("\n");
  }
}
