#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <cassert>
#include <bitset>
using namespace std;

typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define index(xs, x) (int)(lower_bound(all(xs), x) - xs.begin())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007

int H, W;
char O[1000][1000];
bool used[1000][1000];
bool build2(int A, int B) {
  rep(i, W) rep(j, H) O[i][j] = '.', used[i][j] = false;
  rep(i, 3) rep(j, 3) used[i][j] = true;
  O[0][0] = '^';
  O[0][1] = 'v';
  O[0][2] = '<';
  O[1][0] = '<';
  O[1][1] = '.';
  O[1][2] = '>';
  O[2][0] = '>';
  O[2][1] = '^';
  O[2][2] = 'v';
  A -= 2, B -= 2; // !!
  vector<P> four;
  //rep(i, W/2) rep(j, H/2) if (3+i*2<W) four.pb(P(3+i*2, j*2));
  //rep(i, H/2) if(3+i*2<H) four.pb(P(0, 3+i*2));
  //for (P p : four) rep(i, 2) rep(j, 2) used[p._1+i][p._2+j] = true;
  rep(x, W-1) {
    rep(y, H-1) {
      if (y == 0) continue;
      if (used[x][y]+used[x+1][y]+used[x][y+1]+used[x+1][y+1] == 0) {
        four.pb(P(x, y));
        used[x][y]=used[x+1][y]=used[x][y+1]=used[x+1][y+1] = true;
      }
    }
  }

  vector<P> yoko, tate;
  rep(x, W-1) rep(y, H) if (!used[x][y]&&!used[x+1][y]) used[x][y] = true, used[x+1][y] = true, yoko.pb(P(x, y));
  rep(x, W) rep(y, H-1) if (!used[x][y]&&!used[x][y+1]) used[x][y] = true, used[x][y+1] = true, tate.pb(P(x, y));
  int a = min((int)yoko.size(), A);
  rep(i, a) {
    int x = yoko[i]._1, y = yoko[i]._2;
    O[x][y] = '<';
    O[x+1][y] = '>';
  }
  A -= a;
  int b = min((int)tate.size(), B);
  rep(i, b) {
    int x = tate[i]._1, y = tate[i]._2;
    O[x][y] = '^';
    O[x][y+1] = 'v';
  }
  B -= b;
  //cout<<"A="<<A<<", B="<<B<<", four="<<four.size()<<"\n";
  while (A > 0) {
    if (four.empty()) {
      return false;
    }
    int x = four.back()._1, y = four.back()._2;
    four.pop_back();
    if (A == 1) {
      O[x][y] = '<'; O[x+1][y] = '>';
      A--;
    }
    else {
      O[x][y] = '<'; O[x+1][y] = '>';
      O[x][y+1] = '<'; O[x+1][y+1] = '>';
      A -= 2;
    }
  }
  while (B > 0) {
    if (four.empty()) {
      return false;
    }
    int x = four.back()._1, y = four.back()._2;
    four.pop_back();
    if (B == 1) {
      O[x][y] = '^';
      O[x][y+1] = 'v';
      B--;
    }
    else {
      O[x][y] = '^'; O[x+1][y] = '^';
      O[x][y+1] = 'v'; O[x+1][y+1] = 'v';
      B -= 2;
    }
  }
  return true;
}

bool build(int A, int B) {
  rep(i, W) rep(j, H) O[i][j] = '.';
  int yoko = (H%2)*(W/2);
  int tate = (W%2)*(H/2);
  //int four = (W/2)*(H/2);
  vector<P> four;
  rep(i, W/2) rep(j, H/2) four.pb(P(i*2, j*2));
  int a = min(yoko, A);
  rep(i, a) {
    O[i*2][H-1] = '<';
    O[i*2+1][H-1] = '>';
  }
  A -= a;
  int b = min(tate, B);
  rep(i, b) {
    O[W-1][i*2] = '^';
    O[W-1][i*2+1] = 'v';
  }
  B -= b;
  //cout<<"A="<<A<<", B="<<B<<", four="<<four.size()<<"\n";
  while (A > 0) {
    if (four.empty()) {
      return false;
    }
    int x = four.back()._1, y = four.back()._2;
    four.pop_back();
    if (A == 1) {
      O[x][y] = '<'; O[x+1][y] = '>';
      A--;
    }
    else {
      O[x][y] = '<'; O[x+1][y] = '>';
      O[x][y+1] = '<'; O[x+1][y+1] = '>';
      A -= 2;
    }
  }
  while (B > 0) {
    if (four.empty()) {
      return false;
    }
    int x = four.back()._1, y = four.back()._2;
    four.pop_back();
    if (B == 1) {
      O[x][y] = '^';
      O[x][y+1] = 'v';
      B--;
    }
    else {
      O[x][y] = '^'; O[x+1][y] = '^';
      O[x][y+1] = 'v'; O[x+1][y+1] = 'v';
      B -= 2;
    }
  }
  return true;
}
signed main() {
  ios::sync_with_stdio(false); cin.tie(0);
  int A, B;
  cin >> H >> W >> A >> B;
  if (2*A+2*B > W*H) {
    cout << "NO\n";
    return 0;
  }
  if (!build(A, B)) {
    if (W >= 3 && H >= 3 && A >= 2 && B >= 2) {
      if (!build2(A, B)) {
        cout << "NO\n";
        return 0;
      }
    }
    else {
      cout << "NO\n";
      return 0;
    }
  }
  cout << "YES\n";
  rep(y, H) {
    rep(x, W) cout << O[x][y];
    cout<<"\n";
  }
  return 0;
}


Measured memory_bytes: 5440