#include <bits/stdc++.h>
using namespace std;
static const int INF = 0x3f3f3f3f;
static const long long INFL = 0x3f3f3f3f3f3f3f3fLL;
template <typename T, typename U>
static void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
static void amax(T &x, U y) {
  if (x < y) x = y;
}
long long calc(int x) { return (long long)x * (x - 1) / 2; }
int main() {
  int a00;
  int a01;
  int a10;
  int a11;
  while (~scanf("%d%d%d%d", &a00, &a01, &a10, &a11)) {
    int x0 = 0, y0 = 0;
    while (calc(x0) < a00) ++x0;
    while (calc(y0) < a11) ++y0;
    string ans;
    for (int(x) = (int)(x0); (x) <= (int)(x0 + 1); ++(x))
      for (int(y) = (int)(y0); (y) <= (int)(y0 + 1); ++(y)) {
        if (calc(x) != a00 || calc(y) != a11) continue;
        int z = x + y;
        if ((long long)a00 + a01 + a10 + a11 != calc(z)) continue;
        if ((long long)x * y < a01) continue;
        int rem = a01;
        vector<int> v(y);
        for (int(i) = 0; (i) < (int)(y); ++(i)) {
          v[i] = min(rem, x);
          rem -= v[i];
        }
        assert(rem == 0);
        int prev = x;
        for (int(i) = 0; (i) < (int)(y); ++(i)) {
          while (prev > v[i]) {
            ans += '0';
            --prev;
          }
          ans += '1';
        }
        while (prev > 0) {
          ans += '0';
          --prev;
        }
        reverse(ans.begin(), ans.end());
        break;
      }
    if (ans.empty()) {
      puts("Impossible");
    } else {
      puts(ans.c_str());
    }
  }
  return 0;
}
