#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

int N,M,A,B;
char grid[1000][1000];

bool check() {
    if ((A+B)*2 > N*M || (N/2)*M < B || (M/2)*N < A) return 0;
    if ((A+B)*2 == N*M) {
        if (N % 2 == 0 && A % 2 == 1) return 0;
        if (M % 2 == 0 && B % 2 == 1) return 0;
    }
    return 1;
} // special cases ...

void placeA(int x, int y) {
    if (!A) return;
    grid[x][y] = '<';
    grid[x][y+1] = '>';
    A --;
}

void placeB(int x, int y) {
    if (!B) return;
    grid[x][y] = '^';
    grid[x+1][y] = 'v';
    B --;
}

void triA() {
    if (!A) return;
    
    F0R(i,N) F0R(j,M) {
        bool b0 = (j > 0 && grid[i][j-1] == '.');
        bool b1 = (j+1 < M && grid[i][j+1] == '.');
        if (!b0 && !b1) continue;
        if (B == 0) continue;
        
        /*if (grid[i][j] == '<') {
            if (j+2 < M && grid[i][j+2] == '.') {
                placeA(i,j+1);
                if (b0) placeB(i-1,j);
                else placeB(i,j);
            }
        } else if (grid[i][j] == '>') {
            if (j > 1 && grid[i][j-2] == '.') {
                placeA(i,j-2);
                if (b0) placeB(i-1,j);
                else placeB(i,j);
            }
        } else */
        if (grid[i][j] == '.') {
            if (b0) placeA(i,j-1);
            else placeA(i,j);
        }
    }
}

void triB() {
    F0R(i,N) F0R(j,M) {
        bool b0 = (i > 0 && grid[i-1][j] == '.');
        bool b1 = (i+1 < N && grid[i+1][j] == '.');
        if (!b0 && !b1) continue;
        if (B == 0) continue;
        
        /*if (grid[i][j] == '<') {
            if (j+2 < M && grid[i][j+2] == '.') {
                placeA(i,j+1);
                if (b0) placeB(i-1,j);
                else placeB(i,j);
            }
        } else if (grid[i][j] == '>') {
            if (j > 1 && grid[i][j-2] == '.') {
                placeA(i,j-2);
                if (b0) placeB(i-1,j);
                else placeB(i,j);
            }
        } else */
        if (grid[i][j] == '.') {
            if (b0) placeB(i-1,j);
            else placeB(i,j);
        }
    }
}

void solve() {
    int AA = A, BB = B;
    F0R(i,N) F0R(j,M) grid[i][j] = '.';
    if (!check()) {
        cout << "NO\n";
        return;
    }
    if (N&1) {
        for (int i = M%2; i+1 < M; i += 2) placeA(N-1,i);
    }
    if (M&1) {
        for (int i = 0; i+1 < N; i += 2) placeB(i,M-1);
    }
    F0R(i,N/2) F0Rd(j,M/2) {
        if (A >= B && A) {
            placeA(2*i,2*j);
            placeA(2*i+1,2*j);
        } else if (B) {
            placeB(2*i,2*j);
            placeB(2*i,2*j+1);
        }
    }
    triA();
    triB();
    if (A || B) {
        cout << "NO\n";
        // exit(0);
        /*cout << N << " " << M << " " << AA << " " << BB << " " << A << " " << B << "\n";
        F0R(i,N) {
            F0R(j,M) cout << grid[i][j];
            cout << "\n";
        }
        return;*/
    }
    // cout << A << " " << B << " " << 2*(AA+BB) << " " << N*M << "\n";
    cout << "YES\n";
    F0R(i,N) {
        F0R(j,M) cout << grid[i][j];
        cout << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> N >> M >> A >> B;
    /*FOR(i,1,6) FOR(j,1,6) {
        for (int a = 0; 2*a <= i*j; ++a)
            for (int b = 0; 2*b+2*a <= i*j; ++b) {
                N = i, M = j, A = a, B = b;
                solve();
            }
    }*/
    solve();
    
}

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?) ARRAY OUT OF BOUNDSS

Measured memory_bytes: 2176