import sys,collections as cl,bisect as bs
sys.setrecursionlimit(100000)
input = sys.stdin.readline
mod = 10**9+7
Max = sys.maxsize
def l(): #intのlist
    return list(map(int,input().split()))
def m(): #複数文字
    return map(int,input().split())
def onem(): #Nとかの取得
    return int(input())
def s(x): #圧縮
    a = []
    if len(x) == 0:
        return []
    aa = x[0]
    su = 1
    for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
    a.append([aa,su])
    return a
def jo(x): #listをスペースごとに分ける
    return "".join(map(str,x))
def max2(x): #他のときもどうように作成可能
    return max(map(max,x))
def In(x,a): #aがリスト(sorted)
    k = bs.bisect_left(a,x)
    if k != len(a) and a[k] ==  x:
        return True
    else:
        return False

def pow_k(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans

"""
def nibu(x,n,r):
    ll = 0
    rr = r
    while True:
        mid = (ll+rr)//2

    if rr == mid:
        return ll
    if (ここに評価入れる):
        rr = mid
    else:
        ll = mid+1
"""


a = l()

dp = [[0 for i in range(a[1])] for j in range(a[0])]

for i in range(a[0]):
    po = 0
    if i > a[3]-1:
        po = 1

    for j in range(a[1]):
        ppo = po
        if j > a[2] - 1:
            ppo ^= 1
        dp[i][j] = ppo
for i in range(a[0]):
    print(jo(dp[i]))



 import sys,collections as cl,bisect as bs sys collections bisect sys.setrecursionlimit(100000) sys.setrecursionlimit sys setrecursionlimit 100000 input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline mod = 10**9+7 mod 10**9+7 10**9 10 9 7 Max = sys.maxsize Max sys.maxsize sys maxsize def l(): #intのlist
    return list(map(int,input().split())) l return list(map(int,input().split())) list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split def m(): #複数文字
    return map(int,input().split()) m return map(int,input().split()) map(int,input().split()) map int input().split() ().split () input split def onem(): #Nとかの取得
    return int(input()) onem return int(input()) int(input()) int input() input def s(x): #圧縮
    a = []
    if len(x) == 0:
        return []
    aa = x[0]
    su = 1
    for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
    a.append([aa,su])
    return a s a = [] a [] if len(x) == 0:
        return []
     len(x) == 0 len(x) len x 0 return [] [] aa = x[0] aa x[0] x 0 su = 1 su 1 for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
     i range(len(x)-1) range len(x)-1 len(x) len x 1 if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
     aa != x[i+1] aa x[i+1] x i+1 i 1 a.append([aa,su]) a.append a append [aa,su] aa su aa = x[i+1] aa x[i+1] x i+1 i 1 su = 1 su 1 su += 1 su 1 a.append([aa,su]) a.append a append [aa,su] aa su return a a x x def jo(x): #listをスペースごとに分ける
    return "".join(map(str,x)) jo return "".join(map(str,x)) "".join(map(str,x)) "".join "" join map(str,x) map str x x x def max2(x): #他のときもどうように作成可能
    return max(map(max,x)) max2 return max(map(max,x)) max(map(max,x)) max map(max,x) map max x x x def In(x,a): #aがリスト(sorted)
    k = bs.bisect_left(a,x)
    if k != len(a) and a[k] ==  x:
        return True
    else:
        return False In k = bs.bisect_left(a,x) k bs.bisect_left(a,x) bs.bisect_left bs bisect_left a x if k != len(a) and a[k] ==  x:
        return True
    else:
        return False k != len(a) and a[k] ==  x k != len(a) k len(a) len a a[k] ==  x a[k] a k x return True True return False False x x a a def pow_k(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans pow_k ans = 1 ans 1 while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
     n if n % 2:
            ans *= x
         n % 2 n 2 ans *= x ans x x *= x x x n >>= 1 n 1 return ans ans x x n n """
def nibu(x,n,r):
    ll = 0
    rr = r
    while True:
        mid = (ll+rr)//2

    if rr == mid:
        return ll
    if (ここに評価入れる):
        rr = mid
    else:
        ll = mid+1
""" a = l() a l() l [0 for i in range(a[1])] for j in range(a[0]) for j in range(a[0]) j range(a[0]) range a[0] a 0 for j in range(a[0]) [0 for i in range(a[1])] dp = [[0 for i in range(a[1])] for j in range(a[0])] dp [[0 for i in range(a[1])] for j in range(a[0])] for i in range(a[0]):
    po = 0
    if i > a[3]-1:
        po = 1

    for j in range(a[1]):
        ppo = po
        if j > a[2] - 1:
            ppo ^= 1
        dp[i][j] = ppo i range(a[0]) range a[0] a 0 po = 0 po 0 if i > a[3]-1:
        po = 1

     i > a[3]-1 i a[3]-1 a[3] a 3 1 po = 1 po 1 for j in range(a[1]):
        ppo = po
        if j > a[2] - 1:
            ppo ^= 1
        dp[i][j] = ppo j range(a[1]) range a[1] a 1 ppo = po ppo po if j > a[2] - 1:
            ppo ^= 1
         j > a[2] - 1 j a[2] - 1 a[2] a 2 1 ppo ^= 1 ppo 1 dp[i][j] = ppo dp[i][j] [i] dp i j ppo for i in range(a[0]):
    print(jo(dp[i])) i range(a[0]) range a[0] a 0 print(jo(dp[i])) print jo(dp[i]) jo dp[i] dp i input = sys.stdin.readline sys.stdin.readline input ppo = po po ppo po = 0 0 po a = l() l() a def l(): #intのlist
    return list(map(int,input().split())) def l(): #intのlist
    return list(map(int,input().split())) l def m(): #複数文字
    return map(int,input().split()) def m(): #複数文字
    return map(int,input().split()) m mod = 10**9+7 10**9+7 mod dp = [[0 for i in range(a[1])] for j in range(a[0])] [[0 for i in range(a[1])] for j in range(a[0])] dp po = 1 1 po Max = sys.maxsize sys.maxsize Max def s(x): #圧縮
    a = []
    if len(x) == 0:
        return []
    aa = x[0]
    su = 1
    for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
    a.append([aa,su])
    return a def s(x): #圧縮
    a = []
    if len(x) == 0:
        return []
    aa = x[0]
    su = 1
    for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
    a.append([aa,su])
    return a s def onem(): #Nとかの取得
    return int(input()) def onem(): #Nとかの取得
    return int(input()) onem def max2(x): #他のときもどうように作成可能
    return max(map(max,x)) def max2(x): #他のときもどうように作成可能
    return max(map(max,x)) max2 def jo(x): #listをスペースごとに分ける
    return "".join(map(str,x)) def jo(x): #listをスペースごとに分ける
    return "".join(map(str,x)) jo ppo ^= 1 1 ppo def In(x,a): #aがリスト(sorted)
    k = bs.bisect_left(a,x)
    if k != len(a) and a[k] ==  x:
        return True
    else:
        return False def In(x,a): #aがリスト(sorted)
    k = bs.bisect_left(a,x)
    if k != len(a) and a[k] ==  x:
        return True
    else:
        return False In def pow_k(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans def pow_k(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans pow_k
import sys,collections as cl,bisect as bs
sys.setrecursionlimit(100000)
input = sys.stdin.readline
mod = 10**9+7
Max = sys.maxsize
def l(): #intのlist
    return list(map(int,input().split()))
def m(): #複数文字
    return map(int,input().split())
def onem(): #Nとかの取得
    return int(input())
def s(x): #圧縮
    a = []
    if len(x) == 0:
        return []
    aa = x[0]
    su = 1
    for i in range(len(x)-1):
        if aa != x[i+1]:
            a.append([aa,su])
            aa = x[i+1]
            su = 1
        else:
            su += 1
    a.append([aa,su])
    return a
def jo(x): #listをスペースごとに分ける
    return "".join(map(str,x))
def max2(x): #他のときもどうように作成可能
    return max(map(max,x))
def In(x,a): #aがリスト(sorted)
    k = bs.bisect_left(a,x)
    if k != len(a) and a[k] ==  x:
        return True
    else:
        return False

def pow_k(x, n):
    ans = 1
    while n:
        if n % 2:
            ans *= x
        x *= x
        n >>= 1
    return ans

"""
def nibu(x,n,r):
    ll = 0
    rr = r
    while True:
        mid = (ll+rr)//2

    if rr == mid:
        return ll
    if (ここに評価入れる):
        rr = mid
    else:
        ll = mid+1
"""


a = l()

dp = [[0 for i in range(a[1])] for j in range(a[0])]

for i in range(a[0]):
    po = 0
    if i > a[3]-1:
        po = 1

    for j in range(a[1]):
        ppo = po
        if j > a[2] - 1:
            ppo ^= 1
        dp[i][j] = ppo
for i in range(a[0]):
    print(jo(dp[i]))




