#include<bits/stdc++.h>
using namespace std;

#define FOR(i,a,b) for(int i = (a); i < (b); i++)
#define RFOR(i,b,a) for(int i = (b) - 1; i>= (a); i--)
#define ITER(it,a) for(__typeof(a.begin()) it = a.begin(); it != a.end(); it++)
#define FILL(a,value) memset(a,value, sizeof(a))

#define SZ(a) (int)a.size()
#define ALL(a) a.begin(),a.end()
#define MP make_pair
#define PB push_back

typedef vector<int> VI;
typedef long long LL;
typedef pair<int,int> PII;

const double PI = acos(-1.0);
const int INF = 1000 * 1000 * 1000 + 7;
const LL LINF = INF * (LL) INF;

const int MAX = 1010;

char RES[MAX][MAX];
int n, m;
int aa, bb;

bool check()
{
	int a = 0;
	int b = 0;
	FOR (i, 0, n)
	{
		FOR (j, 0, m)
		{
			if (RES[i][j] == '.') continue;
			if (RES[i][j] == '<')
			{
				if (j == m-1) return false;
				if (RES[i][j+1] != '>') return false;
				a++;
			} else
			
			if (RES[i][j] == '>') 
			{
				if (j == 0) return false;
				if (RES[i][j-1] != '<') return false;
			} else
			
			if (RES[i][j] == '^')
			{
				if (i == n-1) return false;
				if (RES[i+1][j] != 'v') return false;
				b++;
			} else
			
			if (RES[i][j] == 'v')
			{
				if (i == 0) return false;
				if (RES[i-1][j] != '^') return false;
			} else return false;
		}
	}
	
	if (a != aa || b != bb) return false;
	return true;
	
}

void no()
{
	cout<<"NO"<<endl;
//	cerr<<n<<' '<<m<<' '<<aa<<' '<<bb<<endl;
//	exit(0);
}

bool yes()
{
	if (!check()) 
	{
		cerr<<n<<' '<<m<<endl;
		cerr<<aa<<' '<<bb<<endl;
		printf("YES\n");
			FOR (i, 0, n)
			{
				RES[i][m] = 0;
				printf("%s\n", RES[i]);
			}
		throw -1;
	}	
	printf("YES\n");
	FOR (i, 0, n)
	{
		RES[i][m] = 0;
		printf("%s\n", RES[i]);
	}
	
	return true;
}

bool solve1(int a, int b, int level)
{
	int n = ::n;
	int m = ::m;
	
	FOR (i, 0, n)
	{
		FOR (j, 0, m)
		{
			RES[i][j] = '.';
		}
	}
	
//	cout<<a<<' '<<b<<endl;
	
	int s = 0, t = 0;
	
	if ((n & 1) && (m & 1))
	{
		FOR (it, 0, level)
//	while(true)
		{
//			cout<<s<<' '<<t<<' '<<n<<' '<<m<<' '<<a<<' '<<b<<endl;
			if (s >= n || t >= m) break;
			if (a >= m-t-1 && b >= n-s-1)
			{
				FOR (i, s, n)
				{
					if (i + 1 == n) break;
					RES[i][t] = '^';
					RES[i+1][t] = 'v';
					
					RES[i+1][m-1] = '^';
					RES[i+2][m-1] = 'v';
					
					i++;
				}
				
				FOR (j, t, m)
				{
					if (j + 1 == m) break;
					RES[s][j+1] = '<';
					RES[s][j+2] = '>';
					
					RES[n-1][j] = '<';
					RES[n-1][j+1] = '>';
					j++;
				}
				
				a -= (m-t-1);
				b -= (n-s-1);
				
				s++;
				t++;
				n--;
				m--;
			}
			else break;
		}
	}

//	cout<<a<<' '<<b<<endl;
	
	if ((n - s) & 1)
	{
		FOR (j, t, m)
		{
			if (j + 1 == m) break;
			if (!a) break;
			RES[n-1][j] = '<';
			RES[n-1][j+1] = '>';
			j++;
			a--;
		}
		n--;
	}
	
	if ((m - t) & 1)
	{
		FOR (i, s, n)
		{
			if (i + 1 == n) break;
			if (!b) break;
			RES[i][m-1] = '^';
			RES[i+1][m-1] = 'v';
			i++;
			b--;
		}
		
		m--;
	}
	
	if (n == s || m == t)
	{
		if (a || b)
		{
			//no();
			return false;
		}
		return yes();
	}
	
	FOR (i, s, n)
	{
		FOR (j, t, m)
		{
			if (a)
			{
				RES[i][j] = '<';
				RES[i][j+1] = '>';
				a--;
				if (a)
				{
					RES[i+1][j] = '<';
					RES[i+1][j+1] = '>';
					a--;
				}
			}
			else
			{
				if (b)
				{
					RES[i][j] = '^';
					RES[i+1][j] = 'v';
					b--;
					if (b)
					{
						RES[i][j+1] = '^';
						RES[i+1][j+1] = 'v';
						b--;
					}
				}
			}
			
			j++;
		}
		i++;
	}
	
//	yes();
	
	if (a || b) return false;
	
	return yes();
}

bool solve2(int a, int b)
{

	int n = ::n;
	int m = ::m;
	FOR (i, 0, n)
		{
			FOR (j, 0, m)
			{
				RES[i][j] = '.';
			}
		}
		
		if (n & 1)
		{
			FOR (j, 0, m)
			{
				if (j + 1 == m) break;
				if (!a) break;
				RES[n-1][j] = '<';
				RES[n-1][j+1] = '>';
				j++;
				a--;
			}
			n--;
		}
		
		if (m & 1)
		{
			FOR (i, 0, n)
			{
				if (i + 1 == n) break;
				if (!b) break;
				RES[i][m-1] = '^';
				RES[i+1][m-1] = 'v';
				i++;
				b--;
			}
			
			m--;
		}
		
		if (n == 0 || m == 0)
		{
			if (a || b)
			{
				//no();
				return false;
			}
			return yes();
		}
		
		FOR (i, 0, n)
		{
			FOR (j, 0, m)
			{
				if (a)
				{
					RES[i][j] = '<';
					RES[i][j+1] = '>';
					a--;
					if (a)
					{
						RES[i+1][j] = '<';
						RES[i+1][j+1] = '>';
						a--;
					}
				}
				else
				{
					if (b)
					{
						RES[i][j] = '^';
						RES[i+1][j] = 'v';
						b--;
						if (b)
						{
							RES[i][j+1] = '^';
							RES[i+1][j+1] = 'v';
							b--;
						}
					}
				}
				
				j++;
			}
			i++;
		}
		
		if (a || b) return false;
		
		return yes();
}

bool solve(int n, int m, int a, int b)
{
	::aa = a;
	::bb = b;
	
	if ((a + b) * 2 > n * m)
	{
		no();
//		return false;
		exit(0);
	}
	
	::n = n;
	::m = m;
	
	FOR (it, 0, max(n, m))
	{
		if (solve1(a, b, it)) return true;
		
		if (clock() / (double)CLOCKS_PER_SEC > 1.9) break;
	}
	
//	if (solve1(a, b, INF)) return true;
//	if (solve2(a, b)) return true;
//	no();
	return false;
}

int CNT = 0;

bool go(int n, int m, int x, int y, int a, int b)
{
	CNT++;
	if (CNT == 1000)
	{
		if (clock() / (double)CLOCKS_PER_SEC > 1.9)
		{
			cout<<"NO"<<endl;
			exit(0);
		}
		CNT = 0;
	}
	
	if (a == 0 && b == 0)
	{
		if (check()) return true;
	}

	if (y >= m) return false;
	
	if (x >= n)
	{
		return go(n, m, 0, y+1, a, b);
	}
	
	if (RES[x][y] != '.') return go(n, m, x+1, y, a, b);
	
	if (x + 1 < n)
	{
		if (RES[x][y] == '.' && RES[x+1][y] == '.')
		{
			RES[x][y] = '^';
			RES[x+1][y] = 'v';
			if (go(n, m, x+2, y, a, b-1)) return true;
			
			RES[x][y] = '.';
			RES[x + 1][y] = '.';
		}
	}
	
	if (y + 1 < m)
	{
		if (RES[x][y] == '.' && RES[x][y+1] == '.')
		{
			RES[x][y] = '<';
			RES[x][y+1] = '>';
			if (go(n, m, x+1, y, a-1, b)) return true;
			
			RES[x][y] = '.';
			RES[x][y+1] = '.';
		}
	}
	
	if (go(n, m, x+1, y, a, b)) return true;
	return false;
	
	
}

bool brute(int n, int m, int a, int b)
{
	if ((a + b) * 2 > n * m) return false;
	FOR (i, 0, n)
	{
		FOR (j, 0, m)
		{
			RES[i][j] = '.';
		}
	}
	
	if (go(n, m, 0, 0, a, b)) return true;
	return false;
	
//	VI v(n*m);
//	FOR (i, 0, a)
//	{
//		v[i] = 1;
//	}
//	FOR (i, b, a+b)
//	{
//		v[i] = 2;
//	}
//	
//	sort(ALL(v));
//	do
//	{
//		FOR (i, 0, n)
//		{
//			FOR (j, 0, m)
//			{
//				RES[i][j] = '.';
//			}
//		}
//		
//		int ind = 0;
//		
//		FOR (i, 0, n)
//		{
//			FOR (j, 0, m)
//			{
//				if (v[ind] == 1)
//				{
//					RES[i][j] = '<';
//					RES[i][j+1] = '>';
//				}
//				if (v[ind] == 2)
//				{
//					RES[i][j] = '^';
//					RES[i+1][j] = 'v';
//				}
//				ind++;
//			}
//		}
//		
//		if (check()) return true;
//	}while(next_permutation(ALL(v)));
//	
//	return false;
}

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

bool solve3(int n, int m, int a, int b)
{

	if ((a + b) * 2 > n * m) return false;

	if (n % 2 == 0 || m % 2 == 0) return false;
	
	FOR (i, 0, n)
	{
		FOR (j, 0, m)
		{
			RES[i][j] = '.';
		}
	}
	
	
	if (n < 3 || m < 3) return false;
	
	int ac = min(a, 2);
	int bc = min(b, 2);
	
	a -= 2;
	b -= 2;
	
	a = max(a, 0);
	b = max(b, 0);
	
	FOR (i, 0, n)
	{
		if (i >= n - 3) continue;
		if (b)
		{
			RES[i][m-1] = '^';
			RES[i+1][m-1] = 'v';
			b--;
		}
		i++;
	}
	
	FOR (j, 0, m)
	{
		if (j >= m - 3) continue;
		
		if (a)
		{
			RES[n-1][j] = '<';
			RES[n-1][j+1] = '>';
			a--;
		}
		j++;
	}
	
	FOR (i, 0, n)
	{
		FOR (j, 0, m)
		{
			if (i >= n-3 && j >= m-3) continue;
			if (i == n-1) continue;
			if (j == m-1) continue;
			
			if (a)
			{
				RES[i][j] = '<';
				RES[i][j+1] = '>';
				a--;
				if (a)
				{
					RES[i+1][j] = '<';
					RES[i+1][j+1] = '>';
					a--;
				}
			}
			else
			{
				if (b)
				{
					RES[i][j] = '^';
					RES[i+1][j] = 'v';
					b--;
					if (b)
					{
						RES[i][j+1] = '^';
						RES[i+1][j+1] = 'v';
						b--;
					}
				}
			}
			
			j++;
		}
		i++;		
	}
	
	
	if (ac) 
	{
		RES[n-3][m-3] = '<';
		RES[n-3][m-2] = '>';
		ac--;
	}
	
	if (ac)
	{
		RES[n-1][m-2] = '<';
		RES[n-1][m-1] = '>';
		ac--;
	}
	
	if (bc)
	{
		RES[n-2][m-3] = '^';
		RES[n-1][m-3] = 'v';
		bc--;
	}
	
	if (bc)
	{
		RES[n-3][m-1] = '^';
		RES[n-2][m-1] = 'v';
		bc--;
	}
	
	if (a == 0 && b == 0 && ac == 0 && bc == 0) return yes();
	return false;
	
}


int main()
{
//	freopen("in.txt", "r", stdin);
	//ios::sync_with_stdio(false); cin.tie(0);
//	freopen("out.txt", "w", stdout);
	
//	FOR (i, 1, 10)
//	{
//		FOR (j, 1, 10)
//		{
//			//cerr<<i<<' '<<j<<endl;
//			FOR (k, 0, 100)
//			{
//				FOR (s, 0, 100)
//				{
//					int n = i;
//					int m = j;
//					int a = k;
//					int b = s;
//					
//					if ((n & 1) && (m & 1))
//					if (!solve(n, m, a, b))
//					{
//						cerr<<"!! "<<n<<' '<<m<<' '<<a<<' '<<b<<endl;
//						if (brute(n, m, a, b)) 
//						{
//							yes();
//							//throw -1;
//							cerr<<"AAAAA "<<endl;
//						}
//						cerr<<"*"<<endl;
//					}
//				}
//			}
//		}
//	}
//	
//	cout<<"Done"<<endl;
//	return 0;
	
	int n, m, a, b;
	scanf("%d%d%d%d", &n, &m, &a, &b);
	
	::n = n;
	::m = m;
	::aa = a;
	::bb = b;

	if (solve3(n, m, a, b)) return 0;
//	return 0;
	
	if (solve(n, m, a, b)) return 0;
//	cout<<brute(n, m, a, b)<<endl;
	if (brute(n, m, a, b)) yes();
	else no();
	
	
}


Measured memory_bytes: 55936