#include <bits/stdc++.h>
using namespace std;
int ni() {
  int val;
  scanf("%i", &val);
  return val;
}
string ns() {
  static char buf[1 << 20];
  scanf("%s", &buf);
  return buf;
}
void ret(string s = "Impossible") {
  printf("%s\n", s.c_str());
  exit(0);
}
int main() {
  int x00 = ni(), x01 = ni(), x10 = ni(), x11 = ni();
  vector<int> rw;
  rw.push_back(0);
  rw.push_back(1);
  for (int i = 2; rw.back() < 1000000001; ++i) rw.push_back(rw.back() + i);
  if (!binary_search(rw.begin(), rw.end(), x00) ||
      !binary_search(rw.begin(), rw.end(), x11))
    ret();
  if (x00 == 0 && x11 == 0 && x01 == 0 && x10 == 0) ret("1");
  string res;
  long long fl = lower_bound(rw.begin(), rw.end(), x00) - rw.begin() + 1;
  long long fr = lower_bound(rw.begin(), rw.end(), x11) - rw.begin() + 1;
  if ((x00 == 0 || x11 == 0) && x01 == 0 && x10 == 0) {
    for (int i = 0; x00 == 0 && i < fr; ++i) res += '1';
    for (int i = 0; x11 == 0 && i < fl; ++i) res += '0';
    ret(res);
  }
  if (fl * fr != x01 + x10) ret();
  res.reserve(fl + fr);
  for (int i = 0; i < fl; ++i) res += '0';
  for (int i = 0; i < fr; ++i) res += '1';
  int got = 0;
  int zm = 0;
  for (int i = fl; got != x10; ++i, ++zm) {
    int max_get = i - zm;
    if (got + max_get >= x10) {
      int t = i - (x10 - got);
      swap(res[i], res[t]);
      got += x10 - got;
    } else {
      swap(res[zm], res[i]);
      got += max_get;
    }
  }
  printf("%s\n", res.c_str());
  return 0;
}
