#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;

int N, M;
int A, B;
char c[1010][1010];
int ok;

int calc()
{
	//int k;
	//if(M<2 && A>0)
	//	return 0;
	//if(N<2 && B>0)
	//	return 0;
	int i=0, j=0;
	if(A>0 && N%2==1){
		while(1){
			if(c[i][j]==0 && j+1<M && c[i][j+1]==0){
				c[i][j] = '<';
				c[i][j+1] = '>';
				j += 2;
				A --;
				if(A==0)
					break;
				if(j==M){
					i ++;
					j = 0;
					if(i==N)
						return 0;
					break;
				}
			}
			else{
				j ++;
				if(j==M){
					i ++;
					j = 0;
					if(i==N)
						return 0;
					break;
				}
			}
		}	
	}
	if(A>0){
		while(1){
			if(A>1 && c[i][j]==0 && j+1<M && c[i][j+1]==0 && c[i+1][j]==0 && c[i+1][j+1]==0){
				c[i][j] = '<';
				c[i][j+1] = '>';
				if(A>1){
					c[i+1][j] = '<';
					c[i+1][j+1] = '>';
				}
				j += 2;
				A -= 2;
				if(A<=0)
					break;
				if(j==M){
					i += 2;
					j = 0;
					if(i>=N)
						return 0;
				}
			}
			else if(A==1 && c[i][j]==0 && j+1<M && c[i][j+1]==0){
				c[i][j] = '<';
				c[i][j+1] = '>';
				j += 2;
				A --;
				if(A<=0)
					break;
				if(j==M){
					i += 2;
					j = 0;
					if(i>=N)
						return 0;
				}
			}
			else{
				j ++;
				if(j==M){
					i += 2;
					j = 0;
					if(i>=N)
						return 0;
				}
			}
		}
	}
	/*for(k=0; k<A; k++){
		if(c[i][j] == 0 && j+1<M){
			c[i][j] = '<';
			c[i][j+1] = '>';
			j += 2;
			if(j==M){
				i ++;
				j = 0;
				if(i==N)
					return 0;
			}
		}
		else{
			i ++;
			j = 0;
			if(i==N)
				return 0;
			c[i][j] = '<';
			c[i][j+1] = '>';
			j += 2;
			if(j==M){
				i ++;
				j = 0;
				if(i==N)
					return 0;
			}
		}
	}*/
	if(B==0)
		return 1;
	i=0, j=0;
	while(1){
		if(c[i][j]==0 && i+1<N && c[i+1][j]==0){
			c[i][j] = '^';
			c[i+1][j] = 'v';
			j ++;
			B --;
			if(B==0)
				return 1;
			if(j==M){
				i ++;
				j = 0;
				if(i==N)
					return 0;
			}
		}
		else{
			j ++;
			if(j==M){
				i ++;
				j = 0;
				if(i==N)
					return 0;
			}
		}
	}
}

int res;
void solve()
{
	int i, j;
	for(i=0; i<N; i++){
		for(j=0; j<M; j++)
			c[i][j] = 0;
	}
	int A1=A, B1=B;
	if(res = calc() ){
		printf("YES\n");
		for(i=0; i<N; i++){
			for(j=0; j<M; j++){
				if(c[i][j] == 0)
					putchar('.');
				else
					putchar(c[i][j]);
			}
			putchar('\n');
		}
	}
	else{
		A = A1, B = B1;
		//if(N%2==1 && M%2==1 && A%2==1){
		if(N%2==1 && M%2==1){
			for(i=0; i<N; i++){
				for(j=0; j<M; j++)
					c[i][j] = 0;
			}
			c[N-1][M-2] = '<';
			c[N-1][M-1] = '>';
			A --;
			if(res = calc() ){
				printf("YES\n");
				for(i=0; i<N; i++){
					for(j=0; j<M; j++){
						if(c[i][j] == 0)
							putchar('.');
						else
							putchar(c[i][j]);
					}
					putchar('\n');
				}
			}
			else{
				printf("NO\n");	
			}
		}
		else{
			printf("NO\n");
		}
	}
}

char c2[100][100];
char c3[100][100];
int ok2;
void srch2(int i, int j, int a, int b)
{
	if(ok2)
		return ;
	if(a==0 && b==0){
		ok2 = 1;
		for(i=0; i<N; i++){
			for(j=0; j<M; j++)
				c3[i][j] = c2[i][j];
		}
		return ;
	}
	if(i==N)
		return ;
	if(j==M){
		srch2(i+1, 0, a, b);
		return ;
	}
	srch2(i, j+1, a, b);
	if(c2[i][j]==0){
		if(j+1<M && c2[i][j+1]==0){
			c2[i][j] = '<';
			c2[i][j+1] = '>';
			srch2(i, j+2, a-1, b);
			c2[i][j] = 0;
			c2[i][j+1] = 0;
		}
		if(i+1<N && c2[i+1][j]==0){
			c2[i][j] = '^';
			c2[i+1][j] = 'v';
			srch2(i, j+1, a, b-1);
			c2[i][j] = 0;
			c2[i+1][j] = 0;
		}
	}
}

int res2;
void solve2()
{
	int i, j;
	ok2 = 0;
	for(i=0; i<N; i++){
		for(j=0; j<M; j++)
			c2[i][j] = 0;
	}
	srch2(0, 0, A, B);
	res2 = ok2;
}

int N1, M1, A1, B1;
void test1()
{
	N1 = rand() % 5+2;
	M1 = rand() % 5+2;
	A1 = rand() % (N1*M1/2);
	if(N1*M1/2-A1==0)
		B1 = 0;
	else
		B1 = N1*M1/2-A1;
	N = N1; M = M1; A = A1; B = B1;
	solve();
	//int tmp = res;
	//swap(N1, M1);
	//swap(A1, B1);
	N = N1; M = M1; A = A1; B = B1;
	solve2();
	if(res2 != res){
		printf("Wrong\n");
		solve();
	}
}

void test()
{
	int i;
	for(i=0; i<100; i++)
		test1();
}

int main()
{
	//test();
	scanf("%d%d", &N, &M);
	scanf("%d%d", &A, &B);
	solve();
	return 0;
}

Measured memory_bytes: 2176