#include <stdio.h>
#include <assert.h>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <array>
#include <vector>
#include <queue>
#include <set>
#include <cmath>
#include <unordered_map>
//#include <unordered_set>
//#include <boost/container/static_vector.hpp>
//#include <boost/unordered_set.hpp>
//#include <boost/unordered_map.hpp>
//#include <unistd.h>

//#include <cv.h>
//#include <highgui.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
#include <string>

const int MAX_N = 1050;
char C[MAX_N][MAX_N];

int N, M, A, B;

bool solve(int n, int m, int a, int b, bool used_corner) {
    if (a == 0 && b == 0) { return true; }
    //std::cout << "solve:" << n << " " << m << " " << a << " " << b << std::endl; 
    if (n % 2 == 1) {
        int last = used_corner ? m - 2: m;
        for (int j = 1; j + 1 <= last; j += 2) {
            if (0 < a) {
                C[n][j] = '<';
                C[n][j+1] = '>';
                a--;
                if (a == 0 && b == 0) { return true; }
            }
        }
        return solve(n - 1, m, a, b, used_corner);
    }
    if (m % 2 == 1) {
        int last = used_corner ? n - 2: n;
        for (int i = 1; i + 1 <= last; i += 2) {
            if (0 < b) {
                C[i][m] = '^';
                C[i+1][m] = 'v';
                b--;
                if (a == 0 && b == 0) { return true; }
            }
        }
        return solve(n, m - 1, a, b, used_corner);
    }

    for (int i = 1; i + 1 <= n; i += 2) {
        for (int j = 1; j + 1 <= m; j += 2) {
            if (used_corner && j == m - 1 && i == n - 1) {
                return false;
            }
            if (0 < a) {
                C[i][j] = '<';
                C[i][j+1] = '>';
                a--;
                if (a == 0 && b == 0) { return true; }
                if (0 < a) {
                    C[i+1][j] = '<';
                    C[i+1][j+1] = '>';
                    a--;
                    if (a == 0 && b == 0) { return true; }
                }
            } else if (0 < b) {
                C[i][j] = '^';
                C[i+1][j] = 'v';
                b--;
                if (a == 0 && b == 0) { return true; }
                if (0 < b) {
                    C[i][j+1] = '^';
                    C[i+1][j+1] = 'v';
                    b--;
                    if (a == 0 && b == 0) { return true; }
                }
            }
        }
    }
    return false;
}

bool solve2(int n, int m, int a, int b) {
    if (3 <= n && 3 <= m && n % 2 == 1 && m % 2 == 1 && 2 <= a && 2 <= b) {
        C[n-2][m-2] = '^'; C[n-2][m-1] = '<'; C[n-2][m  ] = '>';
        C[n-1][m-2] = 'v';                    C[n-1][m  ] = '^';
        C[n  ][m-2] = '<'; C[n  ][m-1] = '>'; C[n  ][m  ] = 'v';
        a -= 2;
        b -= 2;
        if (a == 0 && b == 0) { return true; }
        return solve(n, m, a, b, true);
    }
    return false;
}

int main(int argc, char **argv) {
    std::cin >> N >> M >> A >> B;

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            C[i][j] = '.';
        }
    }

    if (solve(N, M, A, B, false)) {
        std::cout << "YES" << std::endl;
        std::string S;
        for (int i = 1; i <= N; i++) {
            S.clear();
            for (int j = 1; j <= M; j++) {
                S.push_back(C[i][j]);
            }
            std::cout << S << std::endl;
        }
        return 0;
    } 
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            C[i][j] = '.';
        }
    }

    if (solve2(N, M, A, B)) {
        std::cout << "YES" << std::endl;
        std::string S;
        for (int i = 1; i <= N; i++) {
            S.clear();
            for (int j = 1; j <= M; j++) {
                S.push_back(C[i][j]);
            }
            std::cout << S << std::endl;
        }
        return 0;
    }
    
    std::cout << "NO" << std::endl;
    return 0;
}


Measured memory_bytes: 2304