// Template
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <tuple>
#include <map>
#include <set>
#include <algorithm>
#include <utility>
#include <cmath>
#include <complex>
#define rep(i, x) for (int i = 0; i < (x); ++i)
#define rng(i, x, y) for (int i = (x); i < (y); ++i)
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define pb push_back
using namespace std;
using ll = long long;
constexpr int inf = 1001001001;
constexpr ll INF = 3003003003003003003;
template <typename T> inline bool chmin(T &x, const T &y) {if (x > y) {x = y; return 1;} return 0;}
template <typename T> inline bool chmax(T &x, const T &y) {if (x < y) {x = y; return 1;} return 0;}
void solve();
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(10);
    solve();
    return 0;
}

// Main Code
void solve() {
    int n, m, a, b;
    cin >> n >> m >> a >> b;
    
    if (n == 1) {
        if (b == 0 && a * 2 <= m) {
            cout << "YES\n";
            rep(i, a) cout << "<>";
            rep(i, m - 2 * a) cout << ".";
            cout << "\n";
        } else {
            cout << "NO\n";
        }
        return;
    }
    if (m == 1) {
        if (a == 0 && b * 2 <= n) {
            cout << "YES\n";
            rep(i, b) cout << "^\nv\n";
            rep(i, n - 2 * b) cout << ".\n";
        } else {
            cout << "NO\n";
        }
        return;
    }
    if (a * 2 + b * 2 > n * m) {
        cout << "NO\n";
        return;
    }
    
    vector<vector<char>> ans(n, vector<char>(m, '.'));
    int c = 0, d = 0;
    if (n & 1) c = min(a, m / 2);
    if (m & 1) d = min(b, n / 2);
    a -= c; b -= d;
    rep(i, c) {
        ans[n - 1][m - 2 * i - 1] = '>';
        ans[n - 1][m - 2 * i - 2] = '<';
    }
    rep(i, d) {
        ans[2 * i][m - 1] = '^';
        ans[2 * i + 1][m - 1] = 'v';
    }
    
    int x = 0, y = m / 2 * 2 - 1;
    rep(i, a / 2) {
        if (x == n / 2 * 2) {
            cout << "NO\n";
            return;
        }
        ans[x][y - 1] = ans[x + 1][y - 1] = '<';
        ans[x][y] = ans[x + 1][y] = '>';
        y -= 2;
        if (y < 0) {
            y = m / 2 * 2 - 1;
            x += 2;
        }
    }
    rep(i, b / 2) {
        if (x == n / 2 * 2) {
            cout << "NO\n";
            return;
        }
        ans[x][y - 1] = ans[x][y] = '^';
        ans[x + 1][y - 1] = ans[x + 1][y] = 'v';
        y -= 2;
        if (y < 0) {
            y = m / 2 * 2 - 1;
            x += 2;
        }
    }
    if (a & 1) {
        if (x == n / 2 * 2) {
            cout << "NO\n";
            return;
        }
        ans[x][y - 1] = '<';
        ans[x][y] = '>';
        y -= 2;
        if (y < 0) {
            y = 0;
            x += 1;
        }
    }
    if (b & 1) {
        if (x == n - 1) {
            cout << "NO\n";
            return;
        }
        if (ans[x + 1][y] != '.') {
            cout << "NO\n";
            return;
        }
        ans[x][y] = '^';
        ans[x + 1][y] = 'v';
    }
    
    cout << "YES\n";
    rep(i, n) {
        rep(j, m) cout << ans[i][j];
        cout << "\n";
    }
    return;
}


Measured memory_bytes: 4240