#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char c[1005][1005];
int flag=0;
void dfs(int n,int m,int a,int b)
{
    int i,j;
    if (n%2==1)
    {
        for (i=m%2;i+1<m;i+=2)
        {
            if (a<=0) break;
            c[n-1][i]='<';
            c[n-1][i+1]='>';
            a--;
        }
    }
    if (m%2==1)
    {
        for (i=0;i+1<n;i+=2)
        {
            if (b<=0) break;
            c[i][m-1]='^';
            c[i+1][m-1]='v';
            b--;
        }
    }
    
    {
        if ((a%2==1)&&(b%2==1)&&(n%2==1)&&(m%2==1)&&(n>1)&&(m>1))
        {
            c[n-3][0]='<';
            c[n-3][1]='>';
            c[n-2][0]='^';
            c[n-1][0]='v';
            a--;
            b--;
        }
        for (i=0;i+1<n;i+=2)
        {
            for (j=0;j+1<m;j+=2)
            {
                if (c[i][j]!='.') continue;
                if (a!=0)
                {
                    c[i][j]='<';
                    c[i][j+1]='>';
                    a--;
                    if (a!=0)
                    {
                        c[i+1][j]='<';
                        c[i+1][j+1]='>';
                        a--;
                    }
                }
                else
                {
                    if (b!=0)
                    {
                        c[i][j]='^';
                        c[i+1][j]='v';
                        b--;
                        if (b!=0)
                        {
                            c[i][j+1]='^';
                            c[i+1][j+1]='v';
                            b--;
                        }
                        if (b==0) return;
                    }
                }
            }
        }
        if ((a==0)&&(b==0)) return;
        puts("NO");
        flag=-1;
    }
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,m,a,b;
    scanf("%d%d%d%d",&n,&m,&a,&b);
    memset(c,'.',sizeof(c));
    dfs(n,m,a,b);
    if (flag==-1) return 0;
    puts("YES");
    int i;
    for (i=0;i<n;i++)
    {
        c[i][m]='\0';
        printf("%s\n",c[i]);
    }
    return 0;
} 

### Prompt

Create a solution in cpp for the following problem:

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<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char c[1005][1005];
int flag=0;
void dfs(int n,int m,int a,int b)
{
    int i,j;
    if (n%2==1)
    {
        for (i=m%2;i+1<m;i+=2)
        {
            if (a<=0) break;
            c[n-1][i]='<';
            c[n-1][i+1]='>';
            a--;
        }
    }
    if (m%2==1)
    {
        for (i=0;i+1<n;i+=2)
        {
            if (b<=0) break;
            c[i][m-1]='^';
            c[i+1][m-1]='v';
            b--;
        }
    }
    
    {
        if ((a%2==1)&&(b%2==1)&&(n%2==1)&&(m%2==1)&&(n>1)&&(m>1))
        {
            c[n-3][0]='<';
            c[n-3][1]='>';
            c[n-2][0]='^';
            c[n-1][0]='v';
            a--;
            b--;
        }
        for (i=0;i+1<n;i+=2)
        {
            for (j=0;j+1<m;j+=2)
            {
                if (c[i][j]!='.') continue;
                if (a!=0)
                {
                    c[i][j]='<';
                    c[i][j+1]='>';
                    a--;
                    if (a!=0)
                    {
                        c[i+1][j]='<';
                        c[i+1][j+1]='>';
                        a--;
                    }
                }
                else
                {
                    if (b!=0)
                    {
                        c[i][j]='^';
                        c[i+1][j]='v';
                        b--;
                        if (b!=0)
                        {
                            c[i][j+1]='^';
                            c[i+1][j+1]='v';
                            b--;
                        }
                        if (b==0) return;
                    }
                }
            }
        }
        if ((a==0)&&(b==0)) return;
        puts("NO");
        flag=-1;
    }
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,m,a,b;
    scanf("%d%d%d%d",&n,&m,&a,&b);
    memset(c,'.',sizeof(c));
    dfs(n,m,a,b);
    if (flag==-1) return 0;
    puts("YES");
    int i;
    for (i=0;i<n;i++)
    {
        c[i][m]='\0';
        printf("%s\n",c[i]);
    }
    return 0;
} 

```