Problem: You are given P, a permutation of (1,\ 2,\ ...\ N).

A string S of length N consisting of `0` and `1` is a good string when it meets the following criterion:

* The sequences X and Y are constructed as follows:
* First, let X and Y be empty sequences.
* For each i=1,\ 2,\ ...\ N, in this order, append P_i to the end of X if S_i= `0`, and append it to the end of Y if S_i= `1`.
* If X and Y have the same number of high elements, S is a good string. Here, the i-th element of a sequence is called high when that element is the largest among the elements from the 1-st to i-th element in the sequence.



Determine if there exists a good string. If it exists, find the lexicographically smallest such string.

Constraints

* 1 \leq N \leq 2 \times 10^5
* 1 \leq P_i \leq N
* P_1,\ P_2,\ ...\ P_N are all distinct.
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N
P_1 P_2 ... P_N


Output

If a good string does not exist, print `-1`. If it exists, print the lexicographically smallest such string.

Examples

Input

6
3 1 4 6 2 5


Output

001001


Input

5
1 2 3 4 5


Output

-1


Input

7
1 3 2 5 6 4 7


Output

0001101


Input

30
1 2 6 3 5 7 9 8 11 12 10 13 16 23 15 18 14 24 22 26 19 21 28 17 4 27 29 25 20 30


Output

000000000001100101010010011101

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;

const int N = 202000;

pair<int, int> max(const pair<int, int> &a, const pair<int, int> &b) {
  return {max(a.first, b.first), max(a.second, b.second)};
}

pair<int, int> T[N << 2];
int n, a[N], f[2], s[N], H[2], C[2];
string ans;

void Modify(int o, int l, int r, int x, pair<int, int> y) {
  if(l == r)
    return (void)(T[o] = y);
  int mid = l + r >> 1;
  if(x <= mid) Modify(o << 1, l, mid, x, y);
  else Modify(o << 1 | 1, mid + 1, r, x, y);
  T[o] = max(T[o << 1], T[o << 1 | 1]);
}

pair<int, int> Query(int o, int l, int r, int x) {
  if(x > n) return {0, 0};
  if(x <= l)
    return T[o];
  int mid = l + r >> 1;
  pair<int, int> Ans = Query(o << 1 | 1, mid + 1, r, x);
  if(x <= mid) Ans = max(Ans, Query(o << 1, l, mid, x));
  return Ans;
}

bool Check(int x, int val) {
  static int tmp[2];
  tie(tmp[0], tmp[1]) = Query(1, 1, n, a[x] + 1);
  return tmp[val & 1] >= val && val >= 0;
}

int main(void) {
  scanf("%d", &n);
  for(int i = 1, x, mx = 0; i <= n; i++) {
    scanf("%d", &x);
    s[i] = (mx = max(mx, a[i] = x)) == x;
  }
  for(int i = n; i; i--) {
    static int f[2];
    int val = s[i] + 1, x, y;
    s[i] += s[i + 1];
    tie(x, y) = Query(1, 1, n, a[i] + 1);
    f[0] = f[1] = 0;
    f[x + val & 1] = max(f[x + val & 1], x + val);
    f[y + val & 1] = max(f[y + val & 1], y + val);
    Modify(1, 1, n, a[i], {f[0], f[1]});
  }
  
  if(!Check(0, s[1]))
    return puts("-1"), 0;
  
  for(int i = 1; i <= n; i++) {
    int x = a[i] > a[H[0]] ? i : H[0];
    int y = C[0] + (i == x);
    Modify(1, 1, n, a[i], {0, 0});
    if(Check(x, C[1] - y + s[i + 1]) || Check(H[1], y - C[1] + s[i + 1]))
      H[0] = x, C[0] = y, ans += '0';
    else
      H[1] = a[i] > a[H[1]] ? i : H[1], C[1] += i == H[1], ans += '1';
  }
  cout << ans << endl;
  return 0;
}