#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;

// 奇数サイズなら端をできるだけ埋める
// 偶数サイズにできるだけ2x2を端から埋める
// 余ったやつが余ったところに入ればOK

// わからん 3x3に2,2を入れるパターンが謎

char mp[1252][1252];

void clear(int n,int m){
  REP(i,n)REP(j,m)mp[i][j] = '.';
}

bool solve(int n,int m,int a,int b){
  clear(n,m);
  if(a==0 && b==0)return true;
  if(n*m < 2*(a+b))return false;
  int aa = a;
  int bb = b;
  if(n%2==1 && m%2==1 && a>=2 && b>=2){
    // 3x3
    mp[n-3][m-3] = '<'; mp[n-3][m-2] = '>'; mp[n-3][m-1] = '^';
    mp[n-2][m-3] = '^'; mp[n-2][m-2] = '.'; mp[n-2][m-1] = 'v';
    mp[n-1][m-3] = 'v'; mp[n-1][m-2] = '<'; mp[n-1][m-1] = '>';
    a -= 2; b -= 2;
    REP(i,m-3)if(i%2==0&&a>0){
      a--;
      mp[n-3][i] = '<';
      mp[n-3][i+1] = '>';
    }
    REP(j,n-3)if(j%2==0&&b>0){
      b--;
      mp[j][m-3] = '^';
      mp[j+1][m-3] = 'v';
    }
    REP(i,m-3)if(i%2==0 && (a>=2 || b>=2)){
      if(a>=2){
        a-=2;
        mp[n-2][i] = '<'; mp[n-2][i+1] = '>';
        mp[n-1][i] = '<'; mp[n-1][i+1] = '>';
      }else{
        b-=2;
        mp[n-2][i] = '^'; mp[n-2][i+1] = '^';
        mp[n-1][i] = 'v'; mp[n-1][i+1] = 'v';
      }
    }
    REP(j,n-3)if(j%2==0 && (a>=2 || b>=2)){
      if(a>=2){
        a-=2;
        mp[j][m-2] = '<'; mp[j+1][m-2] = '<';
        mp[j][m-1] = '>'; mp[j+1][m-1] = '>';
      }else{
        b-=2;
        mp[j][m-2] = '^'; mp[j+1][m-2] = 'v';
        mp[j][m-1] = '^'; mp[j+1][m-1] = 'v';
      }
    }
    if(solve(n-3,m-3,a,b))return true;
    clear(n,m);
    a=aa;b=bb;
  }
  if(n%2==1){
    REP(i,m)if(i%2==0&&i+1<m&&a>0){
      a--;
      mp[n-1][i] = '<';
      mp[n-1][i+1] = '>';
    }
    if(solve(n-1,m,a,b))return true;
    a=aa;b=bb;
  }
  if(m%2==1){
    REP(j,n)if(j%2==0&&j+1<n&&b>0){
      b--;
      mp[j][m-1] = '^';
      mp[j+1][m-1] = 'v';
    }
    if(solve(n,m-1,a,b))return true;
    a=aa;b=bb;
  }
  if(n%2==1 || m%2==1)return false;
  REP(i,n)REP(j,m)if(i%2==0 && j%2==0 && (a>=2 || b>=2)){
    if(a>=2){
      a-=2;
      mp[i][j] = '<'; mp[i][j+1] = '>';
      mp[i+1][j] = '<'; mp[i+1][j+1] = '>';
    }else{
      b-=2;
      mp[i][j] = '^'; mp[i][j+1] = '^';
      mp[i+1][j] = 'v'; mp[i+1][j+1] = 'v';
    }
  }
  if(a>0){
    REP(i,n)REP(j,m-1)if(a>0 && mp[i][j]=='.' && mp[i][j+1]=='.'){
      a--;
      mp[i][j] = '<'; mp[i][j+1] = '>';
    }
  }
  if(b>0){
    REP(i,n-1)REP(j,m)if(b>0 && mp[i][j]=='.' && mp[i+1][j]=='.'){
      b--;
      mp[i][j] = '^'; mp[i+1][j] = 'v';
    }
  }
  if(a==0&&b==0)return true;
  return false;
}

int main(){
  int n,m,a,b;
  cin>>n>>m>>a>>b;
  if(solve(n,m,a,b)){
    puts("YES");
    REP(i,n)puts(mp[i]);
  }else{
    puts("NO");
  }
  return 0;
}


Measured memory_bytes: 2432