#include<bits/stdc++.h>
//#include <boost/multiprecision/cpp_int.hpp>
//using namespace boost::multiprecision;
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace std;
using namespace __gnu_pbds;
#define PI                      3.1415926535897932384626
#define int                   long long int
//#define ll                      long long int
#define fi                      first
#define se                      second
#define pq                      priority_queue
#define pb                      push_back
#define pf                      pop_front
#define endl                    '\n'
#define all(x)                  x.begin(),x.end()
#define pii                     pair<int,int>
#define fast                    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define hash                    _H
#define lg                      long double         
#define vi                      std::vector<int>
#define vc                      std::vector<char> v;
#define mii                     map<int,int> 
#define SZ(x)                   ((int)x.size())
#define REP(i,a,b)               for(int i = a; i <= b; ++i)
#define fr(i,a,b)              for(int i = a; i < b; ++i)
#define trav(it,v)              for(auto it = v.begin(); it != v.end(); ++it)
#define ordered_set             tree <int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
// find_by_order(x) ==> xth element in the set counting from 0
// order_of_key(x) ==> number of element strictly less than x
 
template<typename T> void println(T &x)                             {cout << x << endl;}
template<typename T> void prints(T &x)                              {cout << x << " ";}
template<typename T> void print(T &x)                               {cout << x;}    
 
template<typename T> void pv(std::vector<T> &v)                     {for(auto i:v) cout << i << " "; cout << endl;}
template<typename T> void pv1(std::vector<T> &v)                    {for(int i = 1; i < SZ(v); ++i) cout << v[i] << " "; cout << endl;}
template<typename T> void pvln(std::vector<T> &v)                   {for(auto i:v) cout << i << endl;}
template<typename T> void pvln1(std::vector<T> &v)                  {for(int i = 1; i < SZ(v); ++i) cout << v[i] << endl;}
 
template<typename T> void p_set(set<T> s)                           {for(auto i:s) cout << i << " "; cout << endl;}
 
template<typename T> void debug(std::vector<T> &v)                  {for(auto i:v) cerr << i <<" "; cerr << endl;}
template<typename T> void d2(T &v)                                  {cerr << v << endl;}
 
 
template<typename T> void in(std::vector<T> &v,int n)               {for(int i = 0; i < n; ++i) cin >> v[i];}
template<typename T> void in1(std::vector<T> &v,int n)              {for(int i = 1; i <= n; ++i) cin >> v[i];}
 
template<typename T> T pow(T a,T b, int m){T ans=1; while(b>0){ if(b%2==1) ans=(ans*a)%m; b/=2; a=(a*a)%m; } return ans%m; }
template<typename T> T InverseMod(T a,T m){return pow(a,m-2,m);}
template<typename T>int SquareDist(T a,T b){int x = abs(a.fi - b.fi),y = abs(a.se - b.se); return x*x + y*y;}
 
 template<typename T> T pow2(T a,T b){T ans=1; while(b>0){ if(b%2==1) ans=(ans*a); b/=2; a=(a*a); } return ans; }
 
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }
 
    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
 
 
// Write only proved sloutions



void solve() {
        int row,col,A,B;
        cin >> row >> col >> A >> B;
        int ans[row][col];
        if(A == 0 and B == 0) {
                for(int i= 0; i < row; ++i) {
                        for(int j = 0; j < col; ++j) {
                                cout << 1;
                        }
                        cout << endl;
                }
                exit(0);
        }
        else if(A == 0) {
                for(int i = 0; i < row; ++i) {
                        for(int j = 0; j < col; ++j) {
                                if(i < B) {
                                        cout << 1;
                                }
                                else {
                                        cout << 0;
                                }
                        }
                        cout << endl;
                }
                exit(0);
        }
        for(int i = 0; i < col; ++i) {
                if(i < A)
                        ans[0][i] = 1;
                else 
                        ans[0][i] = 0;
        }
        if(B == 0) {
                for(int i = 0; i < row; ++i) {
                        for(int j = 0; j < col; ++j) {
                                cout << ans[0][j];
                        }
                        cout << endl;
                }
                exit(0);
        }
        for(int i = 0; i < row; ++i) {
                if(i < B) {
                        ans[i][0] = 1;
                }
                else {
                        ans[i][0] = 0;
                }
        }
        for(int i = 1; i < row; ++i) {
                int st = ans[i][0];
                for(int j = 1; j < col; ++j) {
                        if(j < A) {
                                ans[i][j] = st;
                        }
                        else {
                                ans[i][j] = 1 - st;
                        }
                }
        }
        for(int i = 0; i < row; ++i) {
                int p = 0, q = 0;
                for(int j = 0; j < col; ++j) {
                        if(ans[i][j])
                                p++;
                        else
                                q++;
                }
                if(min(p,q) != A) {
                        cout << -1;
                        exit(0);
                }
        }
        for(int i = 0; i < col; ++i) {
                int p = 0, q = 0;
                for(int j = 0; j < row; ++j) {
                        if(ans[j][i])
                                p++;
                        else
                                q++;
                }
                if(min(p,q) != B) {
                        cout << -1;
                        exit(0);
                }
        }
        for(int i = 0; i < row; ++i) {
                for(int j = 0; j < col; ++j) {
                        cout << ans[i][j];
                }
                cout << endl;
        }
}


int32_t main()
{
        fast;
        int t = 1;
        // cin >> t;
        for(int i = 1; i <= t; ++i)
                solve();
        cerr << "Time taken: " << ((clock() * 1000) / CLOCKS_PER_SEC) << "ms\n";
}

Measured memory_bytes: 9088