#include <bits/stdc++.h>
using namespace std;
template <class T>
void print_array(T a[], int size) {
  for (int i = 0; i < size; i++) cout << a[i] << " ";
  cout << endl;
}
template <class T>
void print_array_v(T &a) {
  int size = a.size();
  for (int i = 0; i < size; i++) cout << a[i] << " ";
  cout << endl;
}
int main() {
  long long int i, j, a, b, c, d, one = 0, zero = 0;
  cin >> a >> b >> c >> d;
  if (a == 0 && b == 0 && c == 0 && d == 0) {
    cout << "0" << endl;
    return 0;
  }
  one = sqrt(d * 2);
  if ((one * (one + 1)) == d * 2)
    one++;
  else
    one = -1;
  zero = sqrt(a * 2);
  if ((zero * (zero + 1)) == 2 * a)
    zero++;
  else
    zero = -1;
  if (d == 0 && b == 0 && c == 0) one = 0;
  if (a == 0 && b == 0 && c == 0) zero = 0;
  bool flag = 0;
  if (one == -1 || zero == -1) {
    cout << "Impossible" << endl;
    assert(flag == 0);
    return 0;
  }
  string ans;
  long long int s = c, zero_rem = zero, one_rem = one;
  for (i = 0; i < one + zero; i++) {
    if (s >= zero_rem)
      s -= zero_rem, ans += '1', one_rem--;
    else
      ans += '0', zero_rem--;
  }
  long long int zero_till = 0, one_till = 0;
  long long int zero_zero = 0, zero_one = 0, one_zero = 0, one_one = 0;
  for (i = 0; i < one + zero; i++) {
    if (ans[i] == '0') {
      zero_till++;
      zero_zero += zero_till - 1;
      one_zero += one_till;
    } else if (ans[i] == '1') {
      one_till++;
      one_one += one_till - 1;
      zero_one += zero_till;
    } else
      assert(1 == 0);
  }
  if (one_one != d || zero_one != b || one_zero != c || zero_zero != a) {
    cout << "Impossible" << endl;
    return 0;
  }
  if (!ans.size()) {
    cout << "Impossible" << endl;
    return 0;
  }
  if (zero_rem != 0 || one_rem != 0) {
    cout << "Impossible" << endl;
    return 0;
  } else
    flag = 1, cout << ans << endl;
  assert(ans.size() <= 1000000);
  return 0;
}
