#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int cnt[N];
inline double getn(int x) { return sqrt((x << 1) + 0.25) + 0.5; }
int main() {
  int a, b, c, d, flag = 0;
  cin >> a >> b >> c >> d;
  double tmp1 = getn(d), tmp0 = getn(a);
  double to = floor(tmp1), tz = floor(tmp0);
  int o = to, z = tz, i;
  if (!a && !b && !c && !d) {
    puts("0");
    return 0;
  }
  if (!b && !c) {
    if ((a && d) || to != tmp1 || tz != tmp0)
      puts("Impossible");
    else {
      if (d) {
        while (o--) putchar('1');
        puts("");
      } else {
        while (z--) putchar('0');
        puts("");
      }
    }
    return 0;
  }
  if (!a && !d) {
    if (b + c > 1)
      puts("Impossible");
    else if (b == 1)
      puts("01");
    else if (c == 1)
      puts("10");
    return 0;
  }
  if (to != tmp1 || tz != tmp0 || o * z != b + c) {
    puts("Impossible");
    return 0;
  }
  while (b >= z) b -= z, o--, cnt[z]++;
  if (b) {
    cnt[b]++;
    c -= z - b;
  }
  while (c >= z) c -= z, o--, cnt[0]++;
  for (i = 0; i < z; i++) {
    while (cnt[i]--) putchar('1');
    putchar('0');
  }
  while (cnt[i]--) putchar('1');
  puts("");
  return 0;
}

### Prompt

Please provide a CPP coded solution to the problem described below:

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;
const int N = 1e6 + 10;
int cnt[N];
inline double getn(int x) { return sqrt((x << 1) + 0.25) + 0.5; }
int main() {
  int a, b, c, d, flag = 0;
  cin >> a >> b >> c >> d;
  double tmp1 = getn(d), tmp0 = getn(a);
  double to = floor(tmp1), tz = floor(tmp0);
  int o = to, z = tz, i;
  if (!a && !b && !c && !d) {
    puts("0");
    return 0;
  }
  if (!b && !c) {
    if ((a && d) || to != tmp1 || tz != tmp0)
      puts("Impossible");
    else {
      if (d) {
        while (o--) putchar('1');
        puts("");
      } else {
        while (z--) putchar('0');
        puts("");
      }
    }
    return 0;
  }
  if (!a && !d) {
    if (b + c > 1)
      puts("Impossible");
    else if (b == 1)
      puts("01");
    else if (c == 1)
      puts("10");
    return 0;
  }
  if (to != tmp1 || tz != tmp0 || o * z != b + c) {
    puts("Impossible");
    return 0;
  }
  while (b >= z) b -= z, o--, cnt[z]++;
  if (b) {
    cnt[b]++;
    c -= z - b;
  }
  while (c >= z) c -= z, o--, cnt[0]++;
  for (i = 0; i < z; i++) {
    while (cnt[i]--) putchar('1');
    putchar('0');
  }
  while (cnt[i]--) putchar('1');
  puts("");
  return 0;
}

```