#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <iostream>
#include <functional>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <bitset>

using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define Fi first
#define Se second
#define pb(x) push_back(x)
#define szz(x) ((int)(x).size())
#define rep(i, n) for(int i=0;i<n;i++)
#define all(x) (x).begin(), (x).end()
typedef tuple<int, int, int> t3;
typedef pair<ll, ll> pll;
typedef long double ldouble;
typedef pair<ldouble, ldouble> pdd;

int N, M, A, B;
vector <pii> PA, PB;
char ans[1010][1010];

void NO() {
	puts("NO");
	exit(0);
}

void solve() {
	scanf("%d%d%d%d", &N, &M, &A, &B);
	
	if(N * M < 2 * (A + B)) NO();
	if(A > M / 2 * N) NO();
	if(B > N / 2 * M) NO();
	
	if(N % 2 == 0) {
		int now_B = N * M / 2, now_A = 0;
		while(now_B >= B + 2 && now_B > (M & 1) * N / 2) now_B -= 2, now_A += 2;
		if(now_B < B || now_A < A) NO();
		
		int ta = now_A;
		for(int i=0;i<N;i+=2) {
			for(int j=0;j<M;j+=2) {
				if(ta > 0 && j + 1 < M) ta -= 2, PA.pb(pii(i, j)), PA.pb(pii(i+1, j));
				else {
					PB.pb(pii(i, j));
					if(j + 1 < M) PB.pb(pii(i, j + 1));
				}
			}
		}
	}
	
	else if(M % 2 == 0) {
		int now_A = N * M / 2, now_B =0;
		while(now_A >= A + 2 && now_A > (N & 1) * M / 2) now_A -= 2, now_B += 2;
		if(now_B < B || now_A < A) NO();
		int tb = now_B;
		for(int i=0;i<M;i+=2) {
			for(int j=0;j<N;j+=2) {
				if(tb > 0 && j + 1 < N) tb -= 2, PB.pb(pii(j, i)), PB.pb(pii(j, i+1));
				else {
					PA.pb(pii(j, i));
					if(j + 1 < N) PA.pb(pii(j + 1, i));
				}
			}
		}
	}
	
	else if(N == 1) { rep(i, A) PA.pb(pii(0, 2*i)); }
	else if(M == 1) { rep(i, B) PB.pb(pii(2*i, 0)); }
	else {
		if(A == M / 2 * N) {
			if(B > N / 2) NO();
			rep(i, N) for(int j=0;j<M-1;j+=2) PA.pb(pii(i, j));
			rep(i, B) PB.pb(pii(2 * i, M - 1));
		}
		else if(B == N / 2 * M) {
			if(A > M / 2) NO();
			rep(i, M) for(int j=0;j<N-1;j+=2) PB.pb(pii(j, i));
			rep(i, A) PA.pb(pii(N - 1, 2 * i));
		}
		else {
			PA.pb(pii(0, 0));
			PA.pb(pii(2, 1));
			PB.pb(pii(1, 0));
			PB.pb(pii(0, 2));
			for(int i=3;i<M;i+=2) PA.pb(pii(0, i));
			for(int j=3;j<N;j+=2) PB.pb(pii(j, 0));
			int r_b = B - szz(PB);
			for(int i=1;i<N;i+=2) for(int j=1;j<M;j+=2) if(i > 1 || j > 1) {
				if(r_b > 0) r_b -= 2, PB.pb(pii(i, j)), PB.pb(pii(i, j+1));
				else PA.pb(pii(i, j)), PA.pb(pii(i+1, j));
			}
			if(szz(PA) < A || szz(PB) < B) {
				if(szz(PA) + szz(PB) == A + B && szz(PA) == A + 1) swap(PA[0], PA.back()), PA.pop_back(), PB.pb(pii(0, 1));
				else if(szz(PA) + szz(PB) == A + B && szz(PA) == A - 1) swap(PB[0], PB.back()), PB.pop_back(), PA.pb(pii(1, 0));
			}
		}
	}
	
	rep(i, N) rep(j, M) ans[i][j] = '.';
	
	rep(i, A) {
		int x = PA[i].first, y = PA[i].second;
		ans[x][y] = '<', ans[x][y+1] = '>';
	}
	rep(i, B) {
		int x = PB[i].first, y = PB[i].second;
		ans[x][y] = '^', ans[x+1][y] = 'v';
	}
	
	puts("YES");
	rep(i, N) printf("%s\n", ans[i]); puts("");
	
}

int main(){
	int Tc = 1; //scanf("%d\n", &Tc);
	for(int tc=1;tc<=Tc;tc++){
		solve();
	}
	return 0;
}

Measured memory_bytes: 6384