#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
#include <utility>
#include <sys/time.h>
#include <cmath>
#include <tuple>
#include <queue>
#include <bitset>

using namespace std;

void solve(long long N, long long M, long long A, long long B){
    vector< vector<char> > ret(N, vector<char>(M, '.'));
    if (N%2 == 0) {
    } else {
        for (int i = 0; i < min(M/2, A); i++) {
            ret[N-1][2*i] = '<';
            ret[N-1][(2*i)+1] = '>';
        }
        A -= min(M/2, A);
    }
    if (M%2 == 0) {
    } else {
        for (int i = 0; i < min(N/2, B); i++) {
            ret[2*i][M-1] = '^';
            ret[(2*i)+1][M-1] = 'v';
        }
        B -= min(N/2, B);
    }
    int a = A%2;
    int b = B%2;
    pair<int, int> p = {0, 0};
    for (int i = 0; i < A/2; i++) {
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            std::cout << "NO" << std::endl;
            return;
        }
        ret[p.first][p.second] = '<';
        ret[p.first+1][p.second] = '<';
        ret[p.first][p.second+1] = '>';
        ret[p.first+1][p.second+1] = '>';
        p.second += 2;
    }
    for (int i = 0; i < B/2; i++) {
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            std::cout << "NO" << std::endl;
            return;
        }
        ret[p.first][p.second] = '^';
        ret[p.first+1][p.second] = 'v';
        ret[p.first][p.second+1] = '^';
        ret[p.first+1][p.second+1] = 'v';
        p.second += 2;
    }
    if (a == 1 && b != 1) {
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            std::cout << "NO" << std::endl;
            return;
        }
        ret[p.first][p.second] = '<';
        ret[p.first][p.second+1] = '>';
    } else if (a != 1 && b == 1) {
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            std::cout << "NO" << std::endl;
            return;
        }
        ret[p.first][p.second] = '^';
        ret[p.first+1][p.second] = 'v';
    } else if (a == 1 && b == 1) {
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            std::cout << "NO" << std::endl;
            return;
        }
        ret[p.first][p.second] = '^';
        ret[p.first+1][p.second] = 'v';
        p.second += 2;
        if (p.second/2 + 1 > M/2) {
            p.first += 2;
            p.second = 0;
        }
        if (p.first/2 + 1 > N/2) {
            if ((N%2 != 0) && (M%2 != 0)) {
                ret[N-1][M-1] = 'v';
                ret[N-2][M-1] = '^';
                ret[N-3][M-1] = '>';
                ret[N-3][M-2] = '<';
            } else {
                std::cout << "NO" << std::endl;
                return;
            }
        } else {
            ret[p.first][p.second] = '<';
            ret[p.first][p.second+1] = '>';
        }
    }
    std::cout << "YES" << std::endl;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            std::cout << ret[i][j];
        }
        std::cout << std::endl;
    }
}

int main(){	
    struct timeval start,end;
    long long span;
    gettimeofday(&start,NULL);

    long long N;
    long long B;
    long long M;
    long long A;
    scanf("%lld",&N);
    scanf("%lld",&M);
    scanf("%lld",&A);
    scanf("%lld",&B);
    solve(N, M, A, B);

    gettimeofday(&end,NULL);
    span = (end.tv_sec -start.tv_sec)*1000000LL + (end.tv_usec - start.tv_usec);
    std::cerr << "--Total Time: " << span/1000 << "ms" << endl;
    return 0;
}


Measured memory_bytes: 2176