#include<bits/stdc++.h>
using namespace std;
using Int = long long;
//INSERT ABOVE HERE
signed main(){
  Int N,M,A,B;
  cin>>N>>M>>A>>B;
  if(N*M<(A+B)*2){
    cout<<"NO"<<endl;
    return 0;
  }
  Int n=N,m=M,a=A,b=B;
  
  vector<string> s(N,string(M,'.'));
  if(m&1){
    Int x=min(b,n/2);
    for(Int i=0;i<x;i++){
      s[i*2][m-1]='^';
      s[i*2+1][m-1]='v';
    }
    b-=x;
    m--;
  }
  
  if(n&1){
    Int x=min(a,m/2);
    for(Int i=0;i<x;i++){
      s[n-1][(M&1)+i*2]='<';
      s[n-1][(M&1)+i*2+1]='>';
    }
    a-=x;
    n--;
  }
  for(Int i=0;i<n;i+=2){
    for(Int j=m-2;j>=0;j-=2){
      if(i+2==n&&j==0&&(N&1)&&(M&1)){
	if(a&&b){
	  s[i][j]='<';
	  s[i][j+1]='>';
	  s[i+1][j]='^';
	  s[i+2][j]='v';       
	  a--;b--;
	  continue;
	}
      }
      if(a>=2){
	s[i][j]='<';
	s[i][j+1]='>';
	a--;
	s[i+1][j]='<';
	s[i+1][j+1]='>';
	a--;
      }else if(b>=2){
	s[i][j]='^';
	s[i+1][j]='v';
	b--;
	s[i][j+1]='^';
	s[i+1][j+1]='v';
	b--;
      }else if(a){
	s[i][j]='<';
	s[i][j+1]='>';
	a--;
      }else if(b){
	s[i][j]='^';
	s[i+1][j]='v';
	b--;
      }
    }
  }
  if(0){
    cout<<a<<" "<<b<<endl;
    for(Int i=0;i<N;i++) cout<<s[i]<<endl;
  }
  
  if(a==0&&b==0){
    cout<<"YES"<<endl;
    for(Int i=0;i<N;i++) cout<<s[i]<<endl;
    return 0;
  }
  cout<<"NO"<<endl;
  return 0;
}

### Prompt

Please provide a cpp coded solution to the problem described below:

Takahashi has an N \times M grid, with N horizontal rows and M vertical columns. Determine if we can place A 1 \times 2 tiles (1 vertical, 2 horizontal) and B 2 \times 1 tiles (2 vertical, 1 horizontal) satisfying the following conditions, and construct one arrangement of the tiles if it is possible:

* All the tiles must be placed on the grid.
* Tiles must not stick out of the grid, and no two different tiles may intersect.
* Neither the grid nor the tiles may be rotated.
* Every tile completely covers exactly two squares.

Constraints

* 1 \leq N,M \leq 1000
* 0 \leq A,B \leq 500000
* N, M, A and B are integers.

Input

Input is given from Standard Input in the following format:


N M A B


Output

If it is impossible to place all the tiles, print `NO`. Otherwise, print the following:


YES
c_{11}...c_{1M}
:
c_{N1}...c_{NM}


Here, c_{ij} must be one of the following characters: `.`, `<`, `>`, `^` and `v`. Represent an arrangement by using each of these characters as follows:

* When c_{ij} is `.`, it indicates that the square at the i-th row and j-th column is empty;
* When c_{ij} is `<`, it indicates that the square at the i-th row and j-th column is covered by the left half of a 1 \times 2 tile;
* When c_{ij} is `>`, it indicates that the square at the i-th row and j-th column is covered by the right half of a 1 \times 2 tile;
* When c_{ij} is `^`, it indicates that the square at the i-th row and j-th column is covered by the top half of a 2 \times 1 tile;
* When c_{ij} is `v`, it indicates that the square at the i-th row and j-th column is covered by the bottom half of a 2 \times 1 tile.

Examples

Input

3 4 4 2


Output

YES
<><>
^<>^
v<>v


Input

4 5 5 3


Output

YES
<>..^
^.<>v
v<>.^
<><>v


Input

7 9 20 20


Output

NO

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
//INSERT ABOVE HERE
signed main(){
  Int N,M,A,B;
  cin>>N>>M>>A>>B;
  if(N*M<(A+B)*2){
    cout<<"NO"<<endl;
    return 0;
  }
  Int n=N,m=M,a=A,b=B;
  
  vector<string> s(N,string(M,'.'));
  if(m&1){
    Int x=min(b,n/2);
    for(Int i=0;i<x;i++){
      s[i*2][m-1]='^';
      s[i*2+1][m-1]='v';
    }
    b-=x;
    m--;
  }
  
  if(n&1){
    Int x=min(a,m/2);
    for(Int i=0;i<x;i++){
      s[n-1][(M&1)+i*2]='<';
      s[n-1][(M&1)+i*2+1]='>';
    }
    a-=x;
    n--;
  }
  for(Int i=0;i<n;i+=2){
    for(Int j=m-2;j>=0;j-=2){
      if(i+2==n&&j==0&&(N&1)&&(M&1)){
	if(a&&b){
	  s[i][j]='<';
	  s[i][j+1]='>';
	  s[i+1][j]='^';
	  s[i+2][j]='v';       
	  a--;b--;
	  continue;
	}
      }
      if(a>=2){
	s[i][j]='<';
	s[i][j+1]='>';
	a--;
	s[i+1][j]='<';
	s[i+1][j+1]='>';
	a--;
      }else if(b>=2){
	s[i][j]='^';
	s[i+1][j]='v';
	b--;
	s[i][j+1]='^';
	s[i+1][j+1]='v';
	b--;
      }else if(a){
	s[i][j]='<';
	s[i][j+1]='>';
	a--;
      }else if(b){
	s[i][j]='^';
	s[i+1][j]='v';
	b--;
      }
    }
  }
  if(0){
    cout<<a<<" "<<b<<endl;
    for(Int i=0;i<N;i++) cout<<s[i]<<endl;
  }
  
  if(a==0&&b==0){
    cout<<"YES"<<endl;
    for(Int i=0;i<N;i++) cout<<s[i]<<endl;
    return 0;
  }
  cout<<"NO"<<endl;
  return 0;
}

```