#include<bits/stdc++.h>
using namespace std;
#define REP(i,st,ed) for(int i=(int)(st),i##end=(int)(ed);i<=i##end;++i)
#define DREP(i,st,ed) for(int i=(int)(st),i##end=(int)(ed);i>=i##end;--i)
template<typename T>bool chkmin(T &x,const T &y){return x>y?x=y,1:0;}
template<typename T>bool chkmax(T &x,const T &y){return x<y?x=y,1:0;}
#ifdef __linux__
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
template<typename T>T read(){
	T x=0,f=1;
	char c=getchar();
	while((c<'0')||(c>'9')){if(c=='-')f=-1;c=getchar();}
	while((c>='0')&&(c<='9'))x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
#define read() read<int>()
template<typename T>void write(T x,char c){
	static char t[25];
	static int tlen;
	t[tlen=1]=c;
	if(x<0)putchar('-'),x=-x;
	do t[++tlen]=(x%10)^48;
	while(x/=10);
	while(tlen)putchar(t[tlen--]);
}
#define pb push_back
typedef long long ll;
typedef double lf;
const int maxn=1005;
int n,m,A,B;
char s[maxn][maxn];
int main(){
	n=read(),m=read(),A=read(),B=read();
	REP(i,1,n)REP(j,1,m)s[i][j]='.';
	if(n&1){
		for(int i=1;(i+1<=m)&&(A);i+=2)
			s[1][i]='<',s[1][i+1]='>',--A;
	}
	if((m&1)&&(m!=1)&&(n!=1)){
		if(A)s[n][m-1]='<',s[n][m]='>',--A;
		if((A&1)&&(n>=2)){
			if((n&1)&&(m>=3))
				s[n-1][m-2]='<',s[n-1][m-1]='>',--A;
			if((!(n&1))&&(m>=2))
				s[n-1][m-1]='<',s[n-1][m]='>',--A;
		}
	}
	REP(j,1,m-1)
		REP(i,1,n)
			if((s[i][j]=='.')&&(s[i][j+1]=='.')&&(A))
				s[i][j]='<',s[i][j+1]='>',--A;
	REP(i,1,n-1)
		REP(j,1,m)
			if((s[i][j]=='.')&&(s[i+1][j]=='.')&&(B))
				s[i][j]='^',s[i+1][j]='v',--B;
	if((A)||(B))puts("NO");
	else{
		puts("YES");
		REP(i,1,n)puts(s[i]+1);
	}
	return 0;
}