#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& cout, const vector<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "()");
  }
  cout << "(" << a[0];
  for (int i = 1; i < (int)a.size(); i++) {
    cout << "; " << a[i];
  }
  return (cout << ")");
}
template <typename T>
ostream& operator<<(ostream& cout, const set<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "{}");
  }
  auto it = a.begin();
  cout << "{" << *it;
  ++it;
  for (; it != a.end(); ++it) {
    cout << "; " << *it;
  }
  return (cout << "}");
}
template <typename T>
ostream& operator<<(ostream& cout, const multiset<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "{}");
  }
  auto it = a.begin();
  cout << "{" << *it;
  ++it;
  for (; it != a.end(); ++it) {
    cout << "; " << *it;
  }
  return (cout << "}");
}
template <typename T1, typename T2>
ostream& operator<<(ostream& cout, const pair<T1, T2>& a) {
  return cout << "(" << a.first << "; " << a.second << ")";
}
const int nmax = 2000 * 1000;
const int inf = 2000 * 1000 * 1000;
const long long infl = 1000ll * 1000ll * 1000ll * 1000ll * 1000ll * 1000ll;
const int mod = 1000 * 1000 * 1000 + 7;
const long double pi = acos(-1.0);
string s;
long long a00, a01, a10, a11;
int main() {
  cin >> a00 >> a01 >> a10 >> a11;
  long long zr = (1 + sqrt(1 + 8 * a00)) / 2;
  long long on = (1 + sqrt(1 + 8 * a11)) / 2;
  if (a01 + a10 == 0) {
    if (a00) {
      on = 0;
    } else {
      zr = 0;
    }
  }
  if (a01 + a10 != on * zr || zr * (zr - 1) / 2 != a00 ||
      on * (on - 1) / 2 != a11) {
    cout << "Impossible\n";
    return 0;
  }
  for (int i = 0; i < zr; i++) {
    s += '0';
  }
  for (int i = 0; i < on; i++) {
    s += '1';
  }
  int ind2 = on + zr - 1;
  a01 -= zr * on;
  for (int i = zr - 1; i >= 0; i--) {
    if (a10 >= on) {
      a10 -= on;
      swap(s[ind2], s[i]);
      ind2--;
    } else {
      swap(s[i + a10], s[i]);
      break;
    }
  }
  cout << s << endl;
}

### Prompt

In cpp, your task is to solve the following problem:

For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}. 

In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.

Input

The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

Output

If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.

Examples

Input

1 2 3 4


Output

Impossible


Input

1 2 2 1


Output

0110

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream& operator<<(ostream& cout, const vector<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "()");
  }
  cout << "(" << a[0];
  for (int i = 1; i < (int)a.size(); i++) {
    cout << "; " << a[i];
  }
  return (cout << ")");
}
template <typename T>
ostream& operator<<(ostream& cout, const set<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "{}");
  }
  auto it = a.begin();
  cout << "{" << *it;
  ++it;
  for (; it != a.end(); ++it) {
    cout << "; " << *it;
  }
  return (cout << "}");
}
template <typename T>
ostream& operator<<(ostream& cout, const multiset<T>& a) {
  if ((int)a.size() == 0) {
    return (cout << "{}");
  }
  auto it = a.begin();
  cout << "{" << *it;
  ++it;
  for (; it != a.end(); ++it) {
    cout << "; " << *it;
  }
  return (cout << "}");
}
template <typename T1, typename T2>
ostream& operator<<(ostream& cout, const pair<T1, T2>& a) {
  return cout << "(" << a.first << "; " << a.second << ")";
}
const int nmax = 2000 * 1000;
const int inf = 2000 * 1000 * 1000;
const long long infl = 1000ll * 1000ll * 1000ll * 1000ll * 1000ll * 1000ll;
const int mod = 1000 * 1000 * 1000 + 7;
const long double pi = acos(-1.0);
string s;
long long a00, a01, a10, a11;
int main() {
  cin >> a00 >> a01 >> a10 >> a11;
  long long zr = (1 + sqrt(1 + 8 * a00)) / 2;
  long long on = (1 + sqrt(1 + 8 * a11)) / 2;
  if (a01 + a10 == 0) {
    if (a00) {
      on = 0;
    } else {
      zr = 0;
    }
  }
  if (a01 + a10 != on * zr || zr * (zr - 1) / 2 != a00 ||
      on * (on - 1) / 2 != a11) {
    cout << "Impossible\n";
    return 0;
  }
  for (int i = 0; i < zr; i++) {
    s += '0';
  }
  for (int i = 0; i < on; i++) {
    s += '1';
  }
  int ind2 = on + zr - 1;
  a01 -= zr * on;
  for (int i = zr - 1; i >= 0; i--) {
    if (a10 >= on) {
      a10 -= on;
      swap(s[ind2], s[i]);
      ind2--;
    } else {
      swap(s[i + a10], s[i]);
      break;
    }
  }
  cout << s << endl;
}

```