#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(x) (x).begin (),(x).end()
#define sqrt(x) sqrt(abs(x))
#define re return
#define sz(x) ((int)(x).size ())
#define prev PREV
#define next NEXT

using ll = long long;
using ii = pair<int, int>;
using ld = long double;
using D = double;
using vi = vector<int>;
using vii = vector<ii>;
using vvi = vector<vi>;
using vs = vector<string>;

template<typename T> T abs (T x) { re x < 0 ? -x : x; }
template<typename T> T sgn (T x) { re x < 0 ? -1 : (x > 0 ? 1 : 0); }
template<typename T> T sqr (T x) { re x * x; }
template<typename T> T gcd (T a, T b) { re a ? gcd (b % a, a) : b; }

int n;
int m;
int v, h;
char res[1001][1001];

int cool (int n, int m, int v, int h) {
	if (v < 0) v = 0;
	if (h < 0) h = 0;
	if (n > m) {
		swap (n, m);
		swap (v, h);
	}
	int mv = (n / 2) * m, mh = n * (m / 2);
	if (v > mv || h > mh) re 0;
	int sv = n * m / 2 - mh;
//	printf ("%d %d %d %d cool\n", n, m, v, h);
	if (n % 2 == 1 && m % 2 == 1) {
		if (v + h > n * m / 2) re 0;
	} else {
		if (v % 2 != sv % 2) v++;
		if (v + h > n * m / 2) re 0;
	}
	re 1;
}

int go (int i1, int j1, int i2, int j2, int v, int h) {
	if (h == 0 && v == 0) re 0;
	int n = i2 - i1;
	int m = j2 - j1;
//	printf ("%d %d %d %d\n", n, m, v, h);
	if (cool (n - 1, m, v, h - m / 2)) {
		int tmp = min (m / 2, h);
		go (i1 + 1, j1, i2, j2, v, h - tmp);
		for (int k = 0; k < tmp; k++) {
			res[i1][j1 + 2 * k] = '<';
			res[i1][j1 + 2 * k + 1] = '>';
		}
		re 0;
	}
	if (cool (n, m - 1, v - n / 2, h)) {
		int tmp = min (n / 2, v);
		go (i1, j1 + 1, i2, j2, v - tmp, h);
		for (int k = 0; k < tmp; k++) {
			res[i1 + 2 * k][j1] = '^';
			res[i1 + 2 * k + 1][j1] = 'v';
		}
		re 0;
	}
	if (m >= 2 && cool (n, m - 2, v, h - n)) {
		int tmp = min (n, h);
		go (i1, j1 + 2, i2, j2, v, h - tmp);
		for (int k = 0; k < tmp; k++) {
			res[i1 + k][j1] = '<';
			res[i1 + k][j1 + 1] = '>';
		}
		re 0;
	}
	if (n >= 2 && cool (n - 2, m, v - m, h)) {
		int tmp = min (m, v);
		go (i1 + 2, j1, i2, j2, v - tmp, h);
		for (int k = 0; k < tmp; k++) {
			res[i1][j1 + k] = '^';
			res[i1 + 1][j1 + k] = 'v';
		}
		re 0;
	}
	assert (n >= 3 && m >= 3 && (n % 2) == 1 && (m % 2) == 1);
	if (cool (n - 2, m - 2, v - min (v, n - 1), h - min (h, m - 1))) {
//		printf ("here\n");
		go (i1 + 1, j1 + 1, i2 - 1, j2 - 1, v - min (v, n - 1), h - min (h, m - 1));
		int tmp;
		tmp = min (h, m / 2);
		for (int k = 0; k < tmp; k++) {
			res[i1][j1 + 2 * k] = '<';
			res[i1][j1 + 2 * k + 1] = '>';
		}
		tmp = min (h, m / 2);
		for (int k = 0; k < tmp; k++) {
			res[i2 - 1][j1 + 1 + 2 * k] = '<';
			res[i2 - 1][j1 + 1 + 2 * k + 1] = '>';
		}
		tmp = min (v, n / 2);
		for (int k = 0; k < tmp; k++) {
			res[i1 + 1 + 2 * k][j1] = '^';
			res[i1 + 1 + 2 * k + 1][j1] = 'v';
		}
		tmp = min (v, n / 2);
		for (int k = 0; k < tmp; k++) {
			res[i1 + 2 * k][j2 - 1] = '^';
			res[i1 + 2 * k + 1][j2 - 1] = 'v';
		}
	} else
	if (n == 3) {
		int tmp;
		tmp = min (h, m / 2);
		for (int k = 0; k < tmp; k++) {
			res[i1][j1 + 2 * k] = '<';
			res[i1][j1 + 2 * k + 1] = '>';
		}
		tmp = min (h, m / 2);
		for (int k = 0; k < tmp; k++) {
			res[i2 - 1][j2 - 2 - 2 * k] = '<';
			res[i2 - 1][j2 - 1 - 2 * k] = '>';
		}
		if (v > 0) {
			res[i1][j2 - 1] = '^';
			res[i1 + 1][j2 - 1] = 'v';
			v--;
		}
		for (int k = 0; k < v; k++) {
			res[i1 + 1][j1 + k] = '^';
			res[i1 + 2][j1 + k] = 'v';
		}
	} else
	if (m == 3) {
		int tmp;
		tmp = min (v, n / 2);
		for (int k = 0; k < tmp; k++) {
			res[i1 + 2 * k][j2 - 1] = '^';
			res[i1 + 2 * k + 1][j2 - 1] = 'v';
		}
		tmp = min (v, n / 2);
		for (int k = 0; k < tmp; k++) {
			res[i2 - 2 - 2 * k][j1] = '^';
			res[i2 - 1 - 2 * k][j1] = 'v';
		}
		if (h > 0) {
			res[i2 - 1][j1 + 1] = '<';
			res[i2 - 1][j1 + 2] = '>';
			h--;
		}
		for (int k = 0; k < h; k++) {
			res[i1 + k][j1] = '<';
			res[i1 + k][j1 + 1] = '>';
		}
	} else {
		assert (false);
	}
	re 0;
}

int main () {
	scanf ("%d%d%d%d", &n, &m, &h, &v);
	if (!cool (n, m, v, h)) {
		printf ("NO\n");
		re 0;
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			res[i][j] = '.';
	go (0, 0, n, m, v, h);
	printf ("YES\n");
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++)
			printf ("%c", res[i][j]);
		printf ("\n");
	}
	return 0;
}

Measured memory_bytes: 2304