Problem:
 Score : 900 points    Problem Statement 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.         Sample Input 1 3 4 4 2      Sample Output 1 YES
<><>
^<>^
v<>v  This is one example of a way to place four 1 \times 2 tiles and three 2 \times 1 tiles on a 3 \times 4 grid.       Sample Input 2 4 5 5 3      Sample Output 2 YES
<>..^
^.<>v
v<>.^
<><>v       Sample Input 3 7 9 20 20      Sample Output 3 NO

Solution (Python):
n,m,a,b=map(int,input().split())
board=[['.']*m for _ in range(n)]
if n*m<2*(a+b):
  print('NO')
  exit()
if n==1 or m==1:
  if n==1 and m==1:
    if a==0 and b==0:
      print('YES')
      print('.')
    else:
      print('NO')
      exit()
  elif n==1:
    if b>=1:
      print('NO')
      exit()
    else:
      if m//2<a:
        print('NO')
        exit()
      else:
        for x in range(0,m//2):
          board[0][2*x]='<'
          board[0][2*x+1]='>'
        print('YES')
        for i in range(n):
          print(''.join(map(str,board[i])))
  elif m==1:
    if a>=1:
      print('NO')
      exit()
    else:
      if n//2<b:
        print('NO')
        exit()
      else:
        for y in range(0,n//2):
          board[2*y][0]='^'
          board[2*y+1][0]='v'
        print('YES')
        for i in range(n):
          print(''.join(map(str,board[i])))
else:
  if (n*m)%2!=1:
    if n%2==1:
      tmp=min(m//2,a)
      a-=tmp
      for i in range(tmp):
        board[n-1][2*i]='<'
        board[n-1][2*i+1]='>'
    if m%2==1:
      tmp=min(n//2,b)
      b-=tmp
      for i in range(tmp):
        board[2*i][m-1]='^'
        board[2*i+1][m-1]='v'
    for y in range(0,n-(n%2),2):
      for x in range(0,m-(m%2),2):
        if a>=2:
          a-=2
          board[y][x]='<'
          board[y][x+1]='>'
          board[y+1][x]='<'
          board[y+1][x+1]='>'
        elif a==1:
          a-=1
          board[y][x]='<'
          board[y][x+1]='>'
        elif b>=2:
          b-=2
          board[y][x]='^'
          board[y+1][x]='v'
          board[y][x+1]='^'
          board[y+1][x+1]='v'
        elif b==1:
          b-=1
          board[y][x]='^'
          board[y+1][x]='v'
    if a!=0 or b!=0:
      print('NO')
    else:
      print('YES')
      for i in range(n):
        print(''.join(map(str,board[i])))
  else:
    if n%2==1:
      tmp=min(m//2-1,a)
      a-=tmp
      for i in range(tmp):
        board[n-1][2*i]='<'
        board[n-1][2*i+1]='>'
    if m%2==1:
      tmp=min(n//2-1,b)
      b-=tmp
      for i in range(tmp):
        board[2*i][m-1]='^'
        board[2*i+1][m-1]='v'
    for y in range(0,n-2,2):
      for x in range(0,m-2,2):
        if y==n-3 and x==m-3:
          continue
        if a>=b:
          if a>=2:
            a-=2
            board[y][x]='<'
            board[y][x+1]='>'
            board[y+1][x]='<'
            board[y+1][x+1]='>'
          elif a==1:
            a-=1
            board[y][x]='<'
            board[y][x+1]='>'
        else:
          if b>=2:
            b-=2
            board[y][x]='^'
            board[y+1][x]='v'
            board[y][x+1]='^'
            board[y+1][x+1]='v'
          elif b==1:
            b-=1
            board[y][x]='^'
            board[y+1][x]='v'
    if a>=4 or b>=4 or a+b>=5:
      print('NO')
      exit()
    x=m-3
    y=n-3
    if a==2 and b==2:
      a-=2
      b-=2
      board[y][x]='<'
      board[y][x+1]='>'
      board[y][x+2]='^'
      board[y+1][x+2]='v'
      board[y+1][x]='^'
      board[y+2][x]='v'
      board[y+2][x+1]='<'
      board[y+2][x+2]='>'
    else:
      if a!=0:
        a-=1
        board[y+2][x]='<'
        board[y+2][x+1]='>'
      if b!=0:
        b-=1
        board[y][x+2]='^'
        board[y+1][x+2]='v'
      if a>=2:
        a-=2
        board[y][x]='<'
        board[y][x+1]='>'
        board[y+1][x]='<'
        board[y+1][x+1]='>'
      elif a==1:
        a-=1
        board[y][x]='<'
        board[y][x+1]='>'
      elif b>=2:
        b-=2
        board[y][x]='^'
        board[y+1][x]='v'
        board[y][x+1]='^'
        board[y+1][x+1]='v'
      elif b==1:
        b-=1
        board[y][x]='^'
        board[y+1][x]='v'
    print('YES')
    for i in range(n):
      print(''.join(map(str,board[i])))

Solution (Python):
import sys
input = sys.stdin.readline

import numpy as np

N,M,A,B = map(int,input().split())

def solve(N,M,A,B):
    grid = np.full((N,M),'.',dtype='U1')
    put_row = np.full((N,M-1),10**9,dtype=np.int32)
    if N%2 == 0:
        for n in range(0,M//2):
            put_row[:,n+n] = np.arange(N*n,N*(n+1))
    elif M%2 == 0:
        
        put_row[-1,::2] = np.arange(M//2)
        x = M//2
        for n in range(M//2):
            put_row[:-1,n+n] = np.arange(x,x+N-1)
            x += N-1
    else:
        
        put_row[-1,1::2] = np.arange(M//2)
        x = M//2
        for n in range(M//2):
            put_row[0,n+n] = x
            put_row[1:-1,n+n+1] = np.arange(x+1,x+N-1)[::-1]
            x += N-1
    
    x,y = np.where(put_row < A)
    if len(x) != A:
        print('NO')
        return
    grid[x,y] = '<'
    grid[x,y+1] = '>'
    
    put_col = (grid == '.')
    
    put_col[:-1] &= put_col[1:]
    put_col[-1] = 0
    for n in range(1,N):
        
        put_col[n] &= ~put_col[n-1]
    x,y = np.where(put_col)
    x = x[:B]; y = y[:B]
    if len(x) != B:
        print('NO')
        return
    grid[x,y] = '^'
    grid[x+1,y] = 'v'
    print('YES')
    print('\n'.join(''.join(row) for row in grid))
    return

solve(N,M,A,B)

Solution (Python):
N,M,A,B=map(int,input().split())
Grid=[["."]*M for i in range(N)]
if M%2:
  for i in range(N//2):
    if B>0:
      Grid[2*i][M-1]="^"
      Grid[2*i+1][M-1]="v"
      B-=1
  
if N%2:
  for i in range(M//2):
    if A>0:
      Grid[N-1][2*i]="<"
      Grid[N-1][2*i+1]=">"
      A-=1
  
for i in range((M//2)*(N//2)):
  a,b=i//(M//2),i%(M//2)
  if A>1:
    Grid[2*a][2*b]="<"
    Grid[2*a][2*b+1]=">"
    Grid[2*a+1][2*b]="<"
    Grid[2*a+1][2*b+1]=">"
    A-=2
  elif B>1:
    Grid[2*a][2*b]="^"
    Grid[2*a][2*b+1]="^"
    Grid[2*a+1][2*b]="v"
    Grid[2*a+1][2*b+1]="v"
    B-=2
  else:
    if A==1:
      Grid[2*a][2*b]="<"
      Grid[2*a][2*b+1]=">"
      A-=1
    elif B==1:
      Grid[2*a][2*b]="^"
      Grid[2*a+1][2*b]="v"
      B-=1

if A==B==0:
  print("YES")
  for i in range(N):
    print("".join(Grid[i]))
else:
  if B==1 and M%2:
    if Grid[N-1][M-1]=="." and Grid[N-1][M-2]==">" and Grid[N-2][M-2]==".":
      Grid[N-1][M-2]="<"
      Grid[N-1][M-1]=">"
      Grid[N-1][M-3]="v"
      Grid[N-2][M-3]="^"
      print("YES")
      for i in range(N):
        print("".join(Grid[i]))
    else:
      print("NO")
  else:
    print("NO")

Solution (Python):
n,m,a,b = list(map(int,input().split()))
ban = [["."]*m for i in range(n)]
aa = a
bb = b
if n%2 == 1 and m %2 == 1 and n>=3 and m>=3 and a>=2 and b>=2:
    aa-=2
    bb-=2
    ban[-3][-3] = "<"
    ban[-3][-2] = ">"
    ban[-3][-1] = "^"
    ban[-2][-3] = "^"
    ban[-2][-1] = "v"
    ban[-1][-3] = "v"
    ban[-1][-2] = "<"
    ban[-1][-1] = ">"
    for i in range(0,m-m%2-2,2):
        if aa == 0:
            break
        ban[-1][i] = "<"
        ban[-1][i+1] = ">"
        aa-=1
    for i in range(0,n-n%2-2,2):
        if bb == 0:
            break
        ban[i][-1] = "^"
        ban[i+1][-1] = "v"
        bb-=1
    n-=1
    m-=1
    yo = aa//2
    ta = bb//2
    yoa = aa%2
    taa = bb%2
    if n*m//4 -1 < yo+ta+yoa+taa:
        n+=1
        m+=1
        ban = [["."]*m for i in range(n)]
    else:
        tu = []
        for i in range(0,n,2):
            for j in range(0,m,2):
                tu.append([i,j])
        tu.pop()
        for i in range(yo+ta):
            x,y = tu[i]
            if i<yo:
                ban[x][y] = "<"
                ban[x+1][y] = "<"
                ban[x][y+1] = ">"
                ban[x+1][y+1] = ">"
            else:
                ban[x][y] = "^"
                ban[x+1][y] = "v"
                ban[x][y+1] = "^"
                ban[x+1][y+1] = "v"            
        if yoa and taa:
            x,y = tu[yo+ta]
            ban[x][y] = "<"
            ban[x][y+1] = ">"
            x,y = tu[yo+ta+1]
            ban[x][y] = "^"
            ban[x+1][y] = "v"
        elif yoa:
            x,y = tu[yo+ta]
            ban[x][y] = "<"
            ban[x][y+1] = ">"
        elif taa:
            x,y = tu[yo+ta]
            ban[x][y] = "^"
            ban[x+1][y] = "v"  
        print("YES")
        for i in ban:
            print("".join(i))
        exit()

if n%2 ==1:
    for i in range(0,m-m%2,2):
        if a == 0:
            break
        ban[-1][i] = "<"
        ban[-1][i+1] = ">"
        a-=1
    n-=1
if m%2 == 1:
    for i in range(0,n,2):
        if b == 0:
            break
        ban[i][-1] = "^"
        ban[i+1][-1] = "v"
        b-=1
    m-=1
if n%2 == 0 and m%2 == 0:
    yo = a//2
    ta = b//2
    yoa = a%2
    taa = b%2
    if n*m//4 < yo+ta+yoa+taa:
        print("NO")
        exit()
    tu = []
    for i in range(0,n,2):
        for j in range(0,m,2):
            tu.append([i,j])
    for i in range(yo+ta):
        x,y = tu[i]
        if i<yo:
            ban[x][y] = "<"
            ban[x+1][y] = "<"
            ban[x][y+1] = ">"
            ban[x+1][y+1] = ">"
        else:
            ban[x][y] = "^"
            ban[x+1][y] = "v"
            ban[x][y+1] = "^"
            ban[x+1][y+1] = "v"            
    if yoa and taa:
        x,y = tu[yo+ta]
        ban[x][y] = "<"
        ban[x][y+1] = ">"
        x,y = tu[yo+ta+1]
        ban[x][y] = "^"
        ban[x+1][y] = "v"
    elif yoa:
        x,y = tu[yo+ta]
        ban[x][y] = "<"
        ban[x][y+1] = ">"
    elif taa:
        x,y = tu[yo+ta]
        ban[x][y] = "^"
        ban[x+1][y] = "v"                      
print("YES")
for i in ban:
    print("".join(i))

Solution (Python):


from collections import deque
import itertools as it
import sys
import math

sys.setrecursionlimit(10000000)

N, M, A, B = map(int, raw_input().split())

ans = [['.'] * M for i in range(N)]

if M % 2 == 1:
    for i in range(0, N - 1, 2):
        if B > 0:
            B -= 1
            ans[i][M - 1], ans[i + 1][M - 1] = "^", "v"

if N % 2 == 1:
    for i in range(M - 2, -1, -2):
        if A > 0:
            A -= 1
            ans[N - 1][i], ans[N - 1][i + 1] = "<", ">"

flag = False
if 2 * (A + B) == (N / 2) * (M / 2) * 4 and (N % 2) == (M % 2) == (A % 2) == 1:
    flag = True
    A += 1

for i in range(N - 2 - N % 2, -1, -2):
    for j in range(0, M - 1, 2):
        if A == 1:
            A -= 2
            ans[i][j], ans[i + 1][j], ans[i][j + 1], ans[i + 1][j + 1] = "<", ".", ">", "."
        elif A >= 2:
            A -= 2
            ans[i][j], ans[i + 1][j], ans[i][j + 1], ans[i + 1][j + 1] = "<", "<", ">", ">"
        elif B == 1:
            B -= 2
            ans[i][j], ans[i + 1][j], ans[i][j + 1], ans[i + 1][j + 1] = "^", "v", ".", "."
        elif B >= 2:
            B -= 2
            ans[i][j], ans[i + 1][j], ans[i][j + 1], ans[i + 1][j + 1] = "^", "v", "^", "v"

if flag:
    ans[N - 2][0], ans[N - 2][1], ans[N - 1][0] = "^", ".", "v"
    B = 0

if A > 0 or B > 0:
    print "NO"
    exit()

print "YES"
for i in range(N):
    print "".join(ans[i])

Solution (Python):
N,M,A,B=map(int,input().split())

def solve(n,m,a,b):

  if a*2+b*2>n*m:
    return False
  else:
    ans=[['.' for x in range(m)] for y in range(n)]

    remainA=a
    remainB=b

    nx=0
    ny=0

    gx=n
    gy=m

    if n%2:
      nx=1
      cnt=0
      while True:
        if cnt > m-2 or remainA==0:
          break
        ans[0][cnt]='<'
        ans[0][cnt+1]='>'
        remainA-=1
        cnt+=2

    if m%2:
      gy-=1
      cnt=0
      while True:
        if cnt > n-2 or remainB==0:
          break
        ans[cnt][m-1]='^'
        ans[cnt+1][m-1]='v'
        remainB-=1
        cnt+=2

    if (n==1 or m==1) and (remainA>0 or remainB>0):
      return False

    cna=remainA
    cnb=remainB

    for i in range(cnb//2):
      ans[nx][ny]='^'
      ans[nx+1][ny]='v'
      ans[nx][ny+1]='^'
      ans[nx+1][ny+1]='v'
      remainB-=2

      if ny+2 < gy-1:
        ny+=2
      elif nx+2 < gx-1:
        nx+=2
        ny=0

      else:
        if remainA>0 or remainB>0:
          return False
        else:
          return ans

    for i in range(cna//2):
      ans[nx][ny]='<'
      ans[nx][ny+1]='>'
      ans[nx+1][ny]='<'
      ans[nx+1][ny+1]='>'
      remainA-=2

      if ny+2 < gy-1:
        ny+=2
      elif nx+2 < gx-1:
        nx+=2
        ny=0

      else:
        if remainA>0 or remainB>0:
          return False
        else:
          return ans

    if remainA%2==0 and remainB%2==0:
      return ans

    elif remainA%2==1 and remainB%2==1:
      ans[nx][ny]='^'
      ans[nx+1][ny]='v'
      if ny+2 < gy-1:
        ny+=2
      elif nx+2 < gx-1:
        nx+=2
        ny=0

      else:
        if ans[n-1][m-1]=='.'  and ans[n-1][m-2]=='.':
          ans[n-1][m-1]='>'
          ans[n-1][m-2]='<'
          return ans
        return False

      ans[nx][ny]='<'
      ans[nx][ny+1]='>'
      return ans

    elif remainA%2==1:
      ans[nx][ny]='<'
      ans[nx][ny+1]='>'
      return ans

    else:
      ans[nx][ny]='^'
      ans[nx+1][ny]='v'
      return ans

Ans=solve(N,M,A,B)
if Ans:
  print("YES")
  for i in range(N):
    res="".join(Ans[i])
    print(res)
else:
  print("NO")

Solution (Python):


def get_next_int():
    return int(float(input()))
def get_next_ints(delim=" "):
    return tuple([int(float(x)) for x in input().split(delim)])

def get_next_str():
    return input()
def get_next_strs(delim=" "):
    return tuple(input().split(delim))

def get_next_by_types(*value_types,delim=" "):
    return tuple([t(x) for t, x in zip(value_types,input().split(delim))])

def main(print=print):
    n, m, a, b = get_next_ints()  
    
    result = {} 
    
    if n % 2 == 1:
        for j in range(1,m,2):
            if a == 0:
                break
            result[(n, j)] = "<"
            result[(n, j+1)] = ">"
            a -= 1
    
    if m % 2 == 1:
        for i in range(1,n,2):
            if b == 0:
                break
            result[(i, m)] = "^"
            result[(i+1, m)] = "v"
            b -= 1
    if n % 2 == 1 and a % 2 == 1 and m % 2 == 1 and b % 2 == 1:
        
        result[(n, m-2)] = "<"
        result[(n, m-1)] = ">"
        result[(n-2, m-1)] = "<"
        result[(n-2, m)] = ">"
        result[(n-1, m)] = "^"
        result[(n , m)] = "v"
        result[(n-2, m-2)] = "^"
        result[(n-1 , m-2)] = "v"
        a -= 1
        b -=1
        
    inside_n = n - (n % 2)
    inside_m = m - (m % 2)
    
    for i in range(1,inside_n+1,2):
        for j in range(1,inside_m+1,2):
            
            if a > 0:
                result[(i, j)] = "<"
                result[(i, j+1)] = ">"
                a -= 1
                if a > 0:
                    result[(i+1, j)] = "<"
                    result[(i+1, j+1)] = ">"
                    a -= 1
            elif b > 0:
                result[(i, j)] = "^"
                result[(i+1, j)] = "v"
                b -= 1
                if b > 0:
                    result[(i, j+1)] = "^"
                    result[(i+1, j+1)] = "v"
                    b -= 1
            else:
                break
        if (a + b) == 0:
            break
    if (a + b) > 0:
        print("NO")
    else:
        print("YES")
        for i in range(1, n+1):
            buffer = []
            for j in range(1, m+1):
                buffer.append(result.get((i,j),"."))
            print("".join(buffer))

if __name__ == '__main__':
    main()

Solution (Python):
import math

def prity(mat):
    for i in range(len(mat)):
        for j in range(len(mat[0])):
            print(mat[i][j], end='')
        print()
        
def tile_a(i, j, mat):
    assert mat[i][j] == '.' and mat[i][j+1] == '.'
    mat[i][j] = '<'
    mat[i][j+1] = '>'
    
def tile_b(i, j, mat):
    assert mat[i][j] == '.' and mat[i+1][j] == '.'
    mat[i][j] = '^'
    mat[i+1][j] = 'v'
    
N, M, A, B = [int(_) for _ in input().split()]
a, b = A, B

mat = [['.' for j in range(M)] for i in range(N)]

if N % 2 == 1:
    i = N - 1 
    for w in range(M // 2):
        if a > 0:
            j = 2 * w + (M % 2)            
            tile_a(i, j, mat)
            a -= 1

if M % 2 == 1:
    j = M - 1 
    for h in range(N // 2):
        if b > 0:
            i = 2 * h
            tile_b(i, j, mat)
            b -= 1
            
height = N // 2
width = M // 2

skip_lst = []
if N % 2 == 1 and M % 2 == 1 and a % 2 == 1 and b % 2 == 1:
    tile_a(2 * (height - 1), 0, mat)
    tile_b(2 * (height - 1) + 1, 0, mat)
    a -= 1
    b -= 1
    skip_lst.append((2 * (height - 1), 0))
    
for h in range(height):
    for w in range(width):
        i = 2 * h
        j = 2 * w
        
        if not((i, j) in skip_lst):
            if a > 1:
                tile_a(i, j, mat)
                tile_a(i + 1, j, mat)
                a -= 2
            elif a == 1:
                tile_a(i, j, mat)
                a -= 1
            elif b > 1:
                tile_b(i, j, mat)
                tile_b(i, j + 1, mat)
                b -= 2
            elif b == 1:
                tile_b(i, j, mat)
                b -= 1
                
if a == 0 and b == 0:
    print("YES")
    prity(mat)
else:
    print("NO")

Solution (Python):
R,C,A,B = map(int,input().split())
if (A+B)*2 > R*C:
    print('NO')
    exit()

ans = [['.' for j in range(C)] for i in range(R)]

if R%2:
    for i in range(C//2):
        if A == 0: break
        ans[-1][i*2] = '<'
        ans[-1][i*2+1] = '>'
        A -= 1
if C%2:
    for i in range(R//2):
        if B == 0: break
        ans[i*2][-1] = '^'
        ans[i*2+1][-1] = 'v'
        B -= 1

for i in range(R//2):
    for j in range(C//2):
        if A > 1:
            for k in range(2):
                ans[i*2+k][j*2] = '<'
                ans[i*2+k][j*2+1] = '>'
                A -= 1
        elif B > 1:
            for k in range(2):
                ans[i*2][j*2+k] = '^'
                ans[i*2+1][j*2+k] = 'v'
                B -= 1
        elif A == 1:
            ans[i*2][j*2] = '<'
            ans[i*2][j*2+1] = '>'
            A -= 1
        elif B == 1:
            ans[i*2][j*2] = '^'
            ans[i*2+1][j*2] = 'v'
            B -= 1

if R%2 and C%2 and B and ans[-2][-3] == '.':
    if ans[-1][-3] == '<':
        ans[-1][-2] = '<'
        ans[-1][-1] = '>'
    ans[-2][-3] = '^'
    ans[-1][-3] = 'v'
    B -= 1

if A > 0 or B > 0:
    print('NO')
else:
    print('YES')
    print(*[''.join(row) for row in ans], sep='\n')

Solution (Python):
def solve(n, m, a, b):
    cell = n * m
    need = 2 * (a + b)
    if cell < need:
        return 'NO'

    d = '.<>^v'
    f = [[0] * m for _ in range(n)]

    if n & 1:
        for j in range(0, m - 1, 2):
            if a:
                f[-1][j] = 1
                f[-1][j + 1] = 2
                a -= 1
            else:
                break
    if m & 1:
        for i in range(0, n - 1, 2):
            if b:
                f[i][-1] = 3
                f[i + 1][-1] = 4
                b -= 1
            else:
                break

    sqa = a // 2
    sqb = b // 2
    sq = sqa + sqb
    ra, rb = a & 1, b & 1
    sqc = (n // 2) * (m // 2)
    if sq > sqc:
        return 'NO'
    if sq == sqc and (ra or rb):
        return 'NO'
    if sq + 1 == sqc and (ra and rb):
        if n & 1 and m & 1:
            f[-3][-3] = f[-1][-2] = 1
            f[-3][-2] = f[-1][-1] = 2
            f[-3][-1] = f[-2][-3] = 3
            f[-2][-1] = f[-1][-3] = 4
            ra = rb = 0
        else:
            return 'NO'

    i, j = 0, 0
    for i in range(0, n - 1, 2):
        for j in range(0, m - 1, 2):
            if sqa:
                f[i][j] = f[i + 1][j] = 1
                f[i][j + 1] = f[i + 1][j + 1] = 2
                sqa -= 1
            elif sqb:
                f[i][j] = f[i][j + 1] = 3
                f[i + 1][j] = f[i + 1][j + 1] = 4
                sqb -= 1
            else:
                break
            
            
            
        else:
            continue
        break
    if ra:
        f[i][j] = 1
        f[i][j + 1] = 2
        j += 2
        if j >= m - 1:
            j = 0
            i += 2
    if rb:
        f[i][j] = 3
        f[i + 1][j] = 4

    return 'YES\n' + '\n'.join(''.join(map(d.__getitem__, r)) for r in f)


n, m, a, b = map(int, input().split())
print(solve(n, m, a, b))

Solution (Python):
import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy,functools

sys.setrecursionlimit(10**7)
inf = 10**20
eps = 1.0 / 10**15
mod = 10**9+7

def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def I(): return int(sys.stdin.readline())
def F(): return float(sys.stdin.readline())
def S(): return input()
def pf(s): return print(s, flush=True)


def main():
    n,m,a,b = LI()
    if n * m < (a+b) * 2:
        return 'NO'
    r = [['.']*m for _ in range(n)]
    if n % 2 == 1:
        for i in range(min(a,m//2)):
            r[-1][i*2] = '<'
            r[-1][i*2+1] = '>'
            a -= 1

    if m % 2 == 1:
        for i in range(min(b,n//2)):
            r[i*2][-1] = '^'
            r[i*2+1][-1] = 'v'
            b -= 1

    if (a%2) * (b%2) * (n%2) * (m%2) == 1 and n > 2 and m > 2:
        r[-1][-1] = 'v'
        r[-2][-1] = '^'
        r[-3][-1] = '>'
        r[-3][-2] = '<'
        r[-3][-3] = '^'
        r[-2][-3] = 'v'
        a -= 1
        b -= 1

    for i in range(n//2):
        for j in range(m//2):
            if a > 0:
                r[i*2][j*2] = '<'
                r[i*2][j*2+1] = '>'
                if a > 1:
                    r[i*2+1][j*2] = '<'
                    r[i*2+1][j*2+1] = '>'
                a -= 2
            elif b <= 0:
                break
            else:
                r[i*2][j*2] = '^'
                r[i*2+1][j*2] = 'v'
                if b > 1:
                    r[i*2][j*2+1] = '^'
                    r[i*2+1][j*2+1] = 'v'
                b -= 2

    if a > 0 or b > 0:
        return 'NO'

    return 'YES\n' + '\n'.join([''.join(c) for c in r])


print(main())