#include<iostream>
#include<algorithm>
#include<cassert>
#include<vector>
#include<fstream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<cmath>

using namespace std;
#define REP(i,m,n) for(int i=m;i<n;++i)
#define REPll(i,m,n) for(ll i=m;i<n;++i)
#define INF 10000000000000000
#define MOD 1000000007
#define ll long long
#define mp make_pair
#define all(v) v.begin(),v.end()

vector<vector<char>>grid(2000,vector<char>(2000,'.'));

int main() {
	int n, m, a, b;
	cin >> n >> m >> a >> b;
	if ((a + b) * 2 > n*m) {
		cout << "NO" << endl;
		return 0;
	}
	if (n % 2 == 1 && m % 2 == 1) {
		REP(i, 0, n / 2) {
			if (b > 0) {
				grid[2 * i][m - 1] = '^';
				grid[2 * i + 1][m - 1] = 'v';
				b--;
			}
		}
		REP(i, 0, m / 2) {
			if (a > 0) {
				grid[n - 1][2 * i] = '<';
				grid[n - 1][2 * i + 1] = '>';
				a--;
			}
		}
		if ((a + b) * 2 > (n-1)*(m-1)) {
			cout << "NO" << endl;
			return 0;
		}
		REP(i, 0, n / 2) {
			REP(j, 0, m / 2) {
				if (i + 1 == n / 2 && j + 1 == m / 2 && a == 1 && b == 1) {
					break;
				}
				if (a > 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					grid[2 * i + 1][2 * j] = '<';
					grid[2 * i + 1][2 * j + 1] = '>';
					a -= 2;
				}
				else if (b > 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					grid[2 * i][2 * j + 1] = '^';
					grid[2 * i + 1][2 * j + 1] = 'v';
					b -= 2;
				}
				else if (a == 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					a--;
				}
				else if (b == 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					b--;
				}
			}
		}
		if (a == 1 && b == 1) {
			grid[n - 1][m - 1] = 'v';
			grid[n - 2][m - 1] = '^';
			grid[n - 3][m - 1] = '>';
			grid[n - 3][m - 2] = '<';
			grid[n - 3][m - 3] = '^';
			grid[n - 2][m - 3] = 'v';
		}
	}
	else if (n % 2 == 0 && m % 2 == 1) {
		REP(i, 0, n / 2) {
			if (b > 0) {
				grid[2 * i][m - 1] = '^';
				grid[2 * i + 1][m - 1] = 'v';
				b--;
			}
		}
		if ((a + b) * 2 > n*(m-1)) {
			cout << "NO" << endl;
			return 0;
		}
		if ((a + b) * 2 == n*(m-1)&&a % 2 == 1) {
			cout << "NO" << endl;
			return 0;
		}
		REP(i, 0, n / 2) {
			REP(j, 0, m / 2) {
				if (a > 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					grid[2 * i + 1][2 * j] = '<';
					grid[2 * i + 1][2 * j + 1] = '>';
					a -= 2;
				}
				else if (b > 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					grid[2 * i][2 * j + 1] = '^';
					grid[2 * i + 1][2 * j + 1] = 'v';
					b -= 2;
				}
				else if (a == 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					a--;
				}
				else if (b == 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					b--;
				}
			}
		}
	}
	else if (n % 2 == 1 && m % 2 == 0) {
		REP(i, 0, m / 2) {
			if (a > 0) {
				grid[n - 1][2 * i] = '<';
				grid[n - 1][2 * i + 1] = '>';
				a--;
			}
		}
		if ((a + b) * 2 > (n-1)*m) {
			cout << "NO" << endl;
			return 0;
		}
		if ((a + b) * 2 == (n - 1)*m && a % 2 == 1) {
			cout << "NO" << endl;
			return 0;
		}
		REP(i, 0, n / 2) {
			REP(j, 0, m / 2) {
				if (a > 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					grid[2 * i + 1][2 * j] = '<';
					grid[2 * i + 1][2 * j + 1] = '>';
					a -= 2;
				}
				else if (b > 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					grid[2 * i][2 * j + 1] = '^';
					grid[2 * i + 1][2 * j + 1] = 'v';
					b -= 2;
				}
				else if (a == 1) {
					grid[2 * i][2 * j] = '<';
					grid[2 * i][2 * j + 1] = '>';
					a--;
				}
				else if (b == 1) {
					grid[2 * i][2 * j] = '^';
					grid[2 * i + 1][2 * j] = 'v';
					b--;
				}
			}
		}
	}
	else {
		if ((a + b) * 2 == n*m&&a % 2 == 1) {
			cout << "NO" << endl;
			return 0;
		}
		REP(i, 0, n / 2) {
			REP(j, 0, m / 2) {
				if (a > 1) {
					grid[2*i][2*j] = '<';
					grid[2*i][2*j + 1] = '>';
					grid[2*i + 1][2*j] = '<';
					grid[2*i + 1][2*j + 1] = '>';
					a -= 2;
				}
				else if (b > 1) {
					grid[2*i][2*j] = '^';
					grid[2*i + 1][2*j] = 'v';
					grid[2*i][2*j + 1] = '^';
					grid[2*i + 1][2*j + 1] = 'v';
					b -= 2;
				}
				else if (a == 1) {
					grid[2*i][2*j] = '<';
					grid[2*i][2*j + 1] = '>';
					a--;
				}
				else if (b == 1) {
					grid[2*i][2*j] = '^';
					grid[2*i + 1][2*j] = 'v';
					b--;
				}
			}
		}
	}
	cout << "YES" << endl;
	REP(i, 0, n) {
		REP(j, 0, m) {
			cout << grid[i][j];
		}
		cout << endl;
	}
	return 0;
}

Measured memory_bytes: 5248