#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <numeric>
#include <algorithm>
#include <bitset>
#include <complex>
#include <array>
#include <list>
#include <stack>
#include <valarray>

using namespace std;

typedef unsigned uint;
typedef long long Int;
typedef unsigned long long UInt;

const int INF = 1001001001;
const Int INFLL = 1001001001001001001LL;

template<typename T> void pv(T a, T b) { for (T i = a; i != b; ++i) cout << *i << " "; cout << endl; }
template<typename T> void chmin(T& a, T b) { if (a > b) a = b; }
template<typename T> void chmax(T& a, T b) { if (a < b) a = b; }
int in() { int x; scanf("%d", &x); return x; }
double fin() { double x; scanf("%lf", &x); return x; }
Int lin() { Int x; scanf("%lld", &x); return x; }

void no() {
  puts("NO");
  exit(0);
}

char F[1024][1024];

void puta(int r, int c) {
  F[r][c] = '<';
  F[r][c + 1] = '>';
}
void putb(int r, int c) {
  F[r][c] = '^';
  F[r + 1][c] = 'v';
}

bool ee_ok(int bs, int A, int B) {
  if (2 * bs < A + B) {
    return false;
  }
  if (2 * bs == A + B) {
    return A % 2 == 0;
  }
  return true;
}

bool solve_ee(int R, int C, int A, int B) {
  for (int i = 0; i + 1 < R; ++i) {
    for (int j = 0; j + 1 < C; ++j) {
      if (F[i][j] == '.' && F[i + 1][j] == '.' && F[i][j + 1] == '.' && F[i + 1][j + 1] == '.') {
        if (A > 0) {
          puta(i, j); --A;
          if (A > 0) {
            puta(i + 1, j); --A;
          }
        } else if (B > 0) {
          putb(i, j); --B;
          if (B > 0) {
            putb(i, j + 1); --B;
          }
        }
      }
    }
  }
  return A == 0 && B == 0;
}

void yes(int R, int C) {
  puts("YES");
  for (int i = 0; i < R; ++i) {
    for (int j = 0; j < C; ++j) {
      putchar(F[i][j]);
    }
    puts("");
  }
  exit(0);
}

int main() {
  memset(F, '.', sizeof(F));
  int N = in();
  int M = in();
  int A = in();
  int B = in();

  if (2 * (A + B) > N * M) {
    no();
  }
  if (N * (M / 2) < A) {
    no();
  }
  if (M * (N / 2) < B) {
    no();
  }

  if (solve_ee(N, M, A, B)) {
    yes(N, M);
  }
  memset(F, '.', sizeof(F));

  const int OA = A, OB = B;
  if (N % 2 == 1) {
    for (int c = 0; c + 1 < M && A > 0; c += 2) {
      puta(N - 1, c);
      --A;
    }
  }
  if (M % 2 == 1) {
    for (int r = 0; r + 1 < N && B > 0; r += 2) {
      putb(r, M - 1);
      --B;
    }
  }
  if (solve_ee(N, M, A, B)) {
    yes(N, M);
  }
  memset(F, '.', sizeof(F));
  A = OA;
  B = OB;

  if (N % 2 == 1 && M % 2 == 1 && N >= 3 && M >= 3) {
    for (int c = 0; c + 1 < M - 3; c += 2) {
      if (A > 0) {
        puta(N - 1, c);
        --A;
      }
    }
    for (int r = 0; r + 1 < N - 3; r += 2) {
      if (B > 0) {
        putb(r, M - 1);
        --B;
      }
    }
    const int bs = ((N - 1) / 2) * ((M - 1) / 2) - 1;
    if (ee_ok(bs, max(0, A - 2), max(0, B - 2))) {
      solve_ee(N, M, max(0, A - 2), max(0, B - 2));
      if (A > 0) { puta(N - 3, M - 3); --A; }
      if (A > 0) { puta(N - 1, M - 2); --A; }
      if (B > 0) { putb(N - 2, M - 3); --B; }
      if (B > 0) { putb(N - 3, M - 1); --B; }
      yes(N, M);
    } else if (ee_ok(bs, max(0, A - 3), max(0, B - 1))) {
      solve_ee(N, M, max(0, A - 3), max(0, B - 1));
      if (A > 0) { puta(N - 3, M - 3); --A; }
      if (A > 0) { puta(N - 2, M - 3); --A; }
      if (A > 0) { puta(N - 1, M - 3); --A; }
      if (B > 0) { putb(N - 3, M - 1); --B; }
      yes(N, M);     
    } else if (ee_ok(bs, max(0, A - 1), max(0, B - 3))) {
      solve_ee(N, M, max(0, A - 1), max(0, B - 3));
      if (B > 0) { putb(N - 3, M - 3); --B; }
      if (B > 0) { putb(N - 3, M - 2); --B; }
      if (B > 0) { putb(N - 3, M - 1); --B; }
      if (A > 0) { puta(N - 1, M - 3); --A; }        
      yes(N, M);
    }
  }

  no();
  return 0;
}


Measured memory_bytes: 2304