#include <bits/stdc++.h>
#define st first
#define nd second

using namespace std;

void debug_out() { cerr << endl; }
template<class T> ostream& prnt(ostream& out, T v) { out << v.size() << '\n'; for(auto e : v) out << e << ' '; return out;}
template<class T> ostream& operator<<(ostream& out, vector <T> v) { return prnt(out, v); }
template<class T> ostream& operator<<(ostream& out, set <T> v) { return prnt(out, v); }
template<class T1, class T2> ostream& operator<<(ostream& out, map <T1, T2> v) { return prnt(out, v); }
template<class T1, class T2> ostream& operator<<(ostream& out, pair<T1, T2> p) { return out << '(' << p.st << ' ' << p.nd << ')'; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H; debug_out(T...);}

#define dbg(...) cerr << #__VA_ARGS__ << " ->", debug_out(__VA_ARGS__)
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"

const int N = 1005;
int n, m, a, b;
string w[N];

int main() {
	ios_base::sync_with_stdio(false);

	cin >> n >> m >> a >> b;

	if(2 * (a + b) > n * m) return cout << "NO\n", 0;

	int tot = a + b;
	for(int i = 0; i < n; i += 2) {
		w[i] = string(m, '.');
		w[i + 1] = string(m, '.');
		for(int j = 0; j + 1 < m && tot > 0; j += 2) {
			w[i][j] = '<', w[i][j + 1] = '>', tot--;
			if(i + 1 < n && tot)
				w[i + 1][j] = '<', w[i + 1][j + 1] = '>', tot--;
		}
	}

	if(tot) {
		for(int i = 0; i + 1 < n && tot && b; i += 2)
			w[i][m - 1] = '^', w[i + 1][m - 1] = 'v', tot--, b--;
	}

	dbg(tot);
	if(tot) return cout << "NO\n", 0;
	
	// for(int i = 0; i < n; i++)
	// 	cout << w[i] << '\n';

	int sch = b / 2;
	int extra = b % 2;
	for(int i = 0; i + 1 < n; i += 2) {
		for(int j = 0; j + 1 < m && sch; j += 2) {
			w[i][j] = '^', w[i][j + 1] = '^',
			w[i + 1][j] = 'v', w[i + 1][j + 1] = 'v', sch--, b -= 2;
		}
	}


	if(sch) {
		dbg(sch);
		// int changed = 0;
		for(int i = 0; i + 1 < m; i += 2)
			if(w[n - 1][i] == '<')
				w[n - 1][i] = w[n - 1][i + 1] = '.';
		// b += ch;
		// sch -= ch / 2;
	}

	dbg(b);

	// for(int i = 0; i < n; i++)
	// 	cout << w[i] << '\n';

	for(int i = 0; i + 1 < n && b > extra; i += 2)
		if(w[i][m - 1] == '.' && w[i + 1][m - 1] == '.')
			w[i][m - 1] = '^', w[i + 1][m - 1] = 'v', b--;

	// if(b == 0) extra = 0;
	dbg(extra);
	dbg(sch);
	
	// for(int i = 0; i < n; i++)
	// 	cout << w[i] << '\n';

	if(extra && n >= 3 && m >= 3) {
		if(w[n - 1][m - 1] == '.' && w[n - 1][m - 3] == '<' && w[n - 2][m - 3] == '<') {
			w[n - 1][m - 3] = 'v';
			w[n - 2][m - 3] = '^';
			w[n - 1][m - 1] = '>';
			w[n - 1][m - 2] = '<';
			w[n - 2][m - 2] = '.';
			extra = 0;
			b--;
		}
	}
	dbg(b, extra);
	if(b > extra) return cout << "NO\n", 0;

	if(extra) {
		int ok = 0, err = 0;
		dbg(ok);
		for(int i = 1; i < n && !ok; i++)
			for(int j = 0; j < m && !ok; j++) {
					if(w[i][j] == '.' && w[i - 1][j] == '.')  {
						ok = 1, err = 1;
					} else if(w[i][j] == '.' && w[i - 1][j] == '<')  {
						w[i - 1][j] = w[i - 1][j + 1] = '.';
						ok = 1;
					} else if(w[i][j] == '.' && w[i - 1][j] == '>')  {
						w[i - 1][j] = w[i - 1][j - 1] = '.';
						ok = 1;
					}else if(w[i][j] == '<' && w[i - 1][j] == '.')  {
						w[i][j] = w[i][j + 1] = '.';
						ok = 1;
					}else if(w[i][j] == '>' && w[i - 1][j] == '.')  {
						w[i][j] = w[i][j - 1] = '.';
						ok = 1;
					}
					if(ok) {
						w[i - 1][j] = '^';
						w[i][j] = 'v';
					}
					if(err) for(int i = 0; i < n; i++) for(int j = 0; j < m && err; j++) if(w[i][j] == '<') w[i][j] = w[i][j + 1] = '.', err = 0;
			}
			if(!ok || err) return cout << "NO\n", 0;
	}
	cout << "YES\n";
	for(int i = 0; i < n; i++)
		cout << w[i] << '\n';

}	

	

Measured memory_bytes: 2304