/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author Rishabhdeep Singh
 */

#include<bits/stdc++.h>
// doot diddly donger cuckerino Hahahahahah
// @formatter:off
#include <iostream>
#include <complex>
#include <vector>
#include <string>
#include <algorithm>
#include <limits>
#include <limits.h>
#include <cstdint>
#include <cstdio>
#include <numeric>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <cmath>
#include <bitset>
#include <cassert>
#include <queue>
#include <stack>
#include <deque>
#include <random>
#include <functional>
#include <iomanip>

using namespace std;

#define PB              push_back
#define F               first
#define S               second
#define all(a)          (a).begin(),(a).end()
#define sz(x)           (int)(x).size()
#define REP(x, n)       for(ll x = 0; x < n; ++x)
#define Unique(x)       sort(all(x)); (x).resize(distance((x).begin(), unique(all(x))));
#define IOS             ios::sync_with_stdio(false);cin.tie(NULL); cout << fixed << setprecision(12)
#define IN_REP          int tt; cin >> tt; while(tt--)
#define sim             template<class T
#define ris            return * this
#define dor            > debug & operator <<
#define eni(x)            sim > typename enable_if<sizeof dud<T>(0) x 1, debug&>::type operator<<(T i)
sim>
struct rge { T b, e; };
sim> rge<T> range(T i, T j) { return rge<T>{i, j}; }
sim> auto dud(T *x) -> decltype(cout << *x, 0);
sim> char dud(...);
struct debug {
#ifdef LOCAL
  ~debug() { cout << endl; }
  eni(!=) {
    cout << boolalpha << i;
    ris;
  }
  eni(==) { ris << range(begin(i), end(i)); }
  sim, class U dor(pair<U, T> d) { ris << "(" << d.first << ", " << d.second << ")"; }
  sim dor(rge<T> d) {
    *this << "[";
    for (auto it = d.b; it != d.e; ++it) *this << ", " + 2 * (it == d.b) << *it;
    ris << "]";
  }
#else
  sim dor(const T&) { ris; }
#endif
};
#define pr(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vb = vector<bool>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vpii = vector<pii>;
using vpll = vector<pll>;

const ld eps = (ld) 1e-9;
const ll MOD = (ll) 1e9 + 7;
const ld PI = acos(-1);
const int N = (int) 5e5 + 5;

sim> T gcd(T x, T y) { return (y == 0) ? x : gcd(y, x % y); }
sim> void mini(T &a, T b) { a = min(a, b); }
sim> void maxi(T &a, T b) { a = max(a, b); }
sim, class U> string to_string(pair<T, U> p) { return "" + to_string(p.F) + " " + to_string(p.S) + ""; }
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
// @formatter:on



class A01Matrix {
  public:
    void solve(std::istream& cin, std::ostream& cout) {
        int h, w, a, b;
        cin >> h >> w >> a >> b;
        for (int i = 0; i < h; ++i) {
            for (int j = 0; j < w; ++j) {
                int x = (j < a) ^ (i < b);
                cout << x;
            }
            cout << endl;
        }
    }
};

int main() {
    IOS;
	A01Matrix solver;
	std::istream& in(std::cin);
	std::ostream& out(std::cout);
	solver.solve(in, out);
	return 0;
}


Measured memory_bytes: 1280