#include <bits/stdc++.h>

#define rep(i,n) for(int i=0; i<(n); i++)
#define reps(i,x,n) for(int i=x; i<(n); i++)
#define rrep(i,n) for(int i=(n)-1; i>=0; i--)
#define all(X) (X).begin(),(X).end()
#define X first
#define Y second
#define pb push_back
#define eb emplace_back

using namespace std;
typedef long long int ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class A, size_t N, class T> void Fill(A (&a)[N], const T &v){ fill( (T*)a, (T*)(a+N), v ); }

template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"; return os;}
template<class T,size_t n> ostream& operator<<(ostream &os, const array<T,n> &t) {os<<"{"; rep(i,n) {os<<t[i]<<",";} os<<"}"; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}

const ll INF = 1e9+7;


int main(){
	ios_base::sync_with_stdio(false);
	int N, M, A, B;

	cin >> N >> M >> A >> B;

	if( N*M < A+B ){
		cout << "NO" << endl;
		return 0;
	}

	bool sw = false;
	if( M % 2 ){
		swap(N, M);
		swap(A, B);
		sw = true;
	}

	vector<string> ans(N,string(M,'.'));

	if( true ){
		int row = max(N - 3, 0);
		if( N%2 == 0 ) row = N;
		int l = min(row / 2, B);
		if( M%2 == 0 ) l = 0;
		B -= l;
		for(int i=0; i<row; i+=2){
			for(int j=0; j<M-(M%2); j+=2){
				if( A > B ){
					rep(k,2) if( A ){
						ans[i+k][j+0] = '<';
						ans[i+k][j+1] = '>';
						A--;
					}
				}else{
					rep(k,2) if( B ){
						ans[i+0][j+k] = '^';
						ans[i+1][j+k] = 'v';
						B--;
					}
				}
			}
			if( l ){
				ans[i  ][M-1] = '^';
				ans[i+1][M-1] = 'v';
				l--;
			}
		}
		if( N%2 ) if( N == 1 ){
			for(int j=0; j<M-(M%2); j+=2){
				if( A ){
					ans[0][j+0] = '<';
					ans[0][j+1] = '>';
					A--;
				}
			}
		}else{
			int i = N-3;
			int m = M-(M%2);
			//if( M >= 3 && M%2 ) m = M - 3;
			bool f = M%2;
			///cout << N << M << A << B << endl;
			for(int j=0; j<m; j+=2){
				if( M >= 3 && M%2 && j == M-3 ){
					int j = M - 3;
					if( A == 2 && B == 2 ){
						ans[i+0][j+0] = '<';
						ans[i+0][j+1] = '>';
						A--;
						ans[i+2][j+1] = '<';
						ans[i+2][j+2] = '>';
						A--;
						ans[i+0][j+2] = '^';
						ans[i+1][j+2] = 'v';
						B--;
						ans[i+1][j+0] = '^';
						ans[i+2][j+0] = 'v';
						B--;
						f = false;
						break;
					}
				}
				if( A - B >= 1 ){
					rep(k,3) if( A ){
						ans[i+k][j+0] = '<';
						ans[i+k][j+1] = '>';
						A--;
					}
				}else{
					rep(k,2) if( B ){
						ans[i+0][j+k] = '^';
						ans[i+1][j+k] = 'v';
						B--;
					}
					if( A ){
						ans[i+2][j+0] = '<';
						ans[i+2][j+1] = '>';
						A--;
					}
				}
			}
			if( f && B ){
				ans[i+0][M-1] = '^';
				ans[i+1][M-1] = 'v';
				B--;
			}
		}
	}

	if( A > 0 || B > 0 ){
		cout << "NO" << endl;
		return 0;
	}

	if(sw){
		map<char,char> conv;
		conv['.'] = '.';
		conv['<'] = '^';
		conv['>'] = 'v';
		conv['^'] = '<';
		conv['v'] = '>';
		vector<string> _ans(M,string(N,'.'));
		rep(i,N) rep(j,M){
			_ans[j][i] = conv[ ans[i][j] ];
		}
		ans = _ans;
	}

	cout << "YES" << endl;
	for(auto s: ans) cout << s << endl;

	return 0;
}

Measured memory_bytes: 3328