#include <bits/stdc++.h>
using namespace std;
int n, Bef[201000];
long long w[201000];
map<pair<int, int>, int> Map[201000];
struct Tree {
  int K[262144 + 262144], T[262144 + 262144];
  void init() {
    for (int i = 0; i < 262144 + 262144; i++) K[i] = -1;
  }
  void Put2(int nd, int x) { K[nd] = T[nd] = x; }
  void UDT(int nd) { T[nd] = (T[nd * 2] | T[nd * 2 + 1]); }
  void Spread(int nd) {
    if (K[nd] != -1) {
      Put2(nd * 2, K[nd]);
      Put2(nd * 2 + 1, K[nd]);
    }
    K[nd] = -1;
  }
  void Put(int nd, int b, int e, int s, int l, int x) {
    if (s > l) return;
    if (s <= b && e <= l) {
      Put2(nd, x);
      return;
    }
    Spread(nd);
    int m = (b + e) >> 1;
    if (s <= m) Put(nd * 2, b, m, s, l, x);
    if (l > m) Put(nd * 2 + 1, m + 1, e, s, l, x);
    UDT(nd);
  }
  int Left(int nd, int b, int e, int s, int l) {
    if (!T[nd]) return l + 1;
    if (s > l) return l + 1;
    if (b == e) return b;
    Spread(nd);
    int m = (b + e) >> 1;
    if (s <= m) {
      int x = Left(nd * 2, b, m, s, l);
      if (x <= l) return x;
    }
    if (l > m) {
      return Left(nd * 2 + 1, m + 1, e, s, l);
    }
    return l + 1;
  }
} IT;
struct Range {
  int b, e;
};
vector<Range> Save;
long long Sum1(int b, int e) {
  return 1ll * ((n - b + 1) + (n - e + 1)) * (e - b + 1) / 2;
}
void Calc(int b, long long x, int e, long long y) {
  int i;
  for (i = 0; i <= e - b - 1; i++) {
    long long t2 = Sum1(b + 1, b + i) + x;
    long long t1 = Sum1(e - i, e - 1) + x;
    long long tp = n - e + 1;
    if (t1 + tp <= y && y <= t2 + tp) {
      Map[e][{e, e}] = b;
      Save.push_back({e, e});
    }
    long long bbb = n + 1 + t1 - y + 1;
    long long eee = n + 1 + t2 - y + 1;
    bbb = max(bbb, (long long)e + 1);
    eee = min(eee, (long long)n + 1);
    if (bbb <= eee) {
      int b1 = bbb, e1 = eee;
      Map[e][{b1, e1}] = b;
      Save.push_back({b1, e1});
    }
  }
}
void Do(int b, int e) {
  Save.clear();
  if (IT.Left(1, 0, n + 1, b, b) == b) {
    Calc(b, w[b], e, w[e]);
  }
  int pp = IT.Left(1, 0, n + 1, b + 1, e - 1);
  if (b + 1 <= pp && pp <= e - 1) {
    Calc(pp, w[b] - 1, e, w[e]);
  }
  if (IT.Left(1, 0, n + 1, e, e) == e && w[e] != w[b] - 1) {
    IT.Put(1, 0, n + 1, e, e, 0);
  }
  if (w[b] != w[e]) {
    IT.Put(1, 0, n + 1, e + 1, n + 1, 0);
  }
  IT.Put(1, 0, n + 1, 0, e - 1, 0);
  for (auto &t : Save) {
    IT.Put(1, 0, n + 1, t.b, t.e, 1);
  }
}
int Res[201000];
void Print2(long long b, long long e, int c, long long s) {
  if (c == 0) return;
  long long t2 = Sum1(b + 1, b + c - 1);
  long long t1 = Sum1(e - c + 2, e);
  if (t1 <= s - (n - b + 1) && s - (n - b + 1) <= t2) {
    Res[b] = 1;
    Print2(b + 1, e, c - 1, s - (n - b + 1));
  } else {
    Print2(b + 1, e, c, s);
  }
}
void Print(int ty, long long s1, int x, int y, long long s2) {
  Res[ty] = Res[y] = 1;
  long long ss = s2 - (n - y + 1) - s1;
  int i;
  for (i = 0; i <= x - ty - 1; i++) {
    long long t2 = Sum1(ty + 1, ty + i);
    long long t1 = Sum1(x - i, x - 1);
    if (t1 <= ss && ss <= t2) {
      Print2(ty + 1, x - 1, i, ss);
      return;
    }
  }
}
int RR[101000];
long long Res2[101000];
int main() {
  int i, DEB = 0;
  scanf("%d", &n);
  mt19937 rng((unsigned)time(NULL));
  if (DEB) {
    long long ss = 0;
    for (i = 1; i <= n + 1; i++) {
      RR[i] = !!(rng() % 5);
      if (i == n + 1) RR[i] = 1;
      if (RR[i]) {
        ss += (n - i + 1);
        Res2[i] = ss;
      }
    }
    for (i = 1; i <= n; i++) printf("%d", RR[i]);
    puts("");
    long long z = Res2[n + 1];
    for (i = n; i >= 1; i--) {
      if (Res2[i])
        z = Res2[i];
      else
        Res2[i] = z + 1;
    }
  }
  int ck = 0;
  for (i = 1; i <= n; i++) {
    if (!DEB) {
      scanf("%lld", &w[i]);
    }
    if (DEB) {
      if (rng() % 3 == 0) {
        w[i] = Res2[i];
      }
      printf("%lld ", w[i]);
    }
    if (w[i] != 0 && w[i] != 1) ck = 1;
  }
  if (!ck) {
    for (i = 1; i <= n; i++) printf("0");
    puts("");
    return 0;
  }
  IT.Put(1, 0, n + 1, 0, 0, 1);
  int prv = 0;
  for (i = 1; i <= n; i++) {
    if (!w[i]) continue;
    Do(prv, i);
    Bef[i] = prv;
    prv = i;
  }
  int x = prv, y = IT.Left(1, 0, n + 1, 0, n + 1);
  while (x) {
    for (auto &t : Map[x]) {
      pair<int, int> tp = t.first;
      if (tp.first <= y && y <= tp.second) {
        int ty = t.second;
        long long s1 = w[Bef[x]], s2 = w[x];
        if (ty != Bef[x]) {
          s1--;
        }
        if (y != x) {
          s2--;
        }
        Print(ty, s1, x, y, s2);
        y = ty;
        break;
      }
    }
    x = Bef[x];
  }
  for (i = 1; i <= n; i++) printf("%d", Res[i]);
  puts("");
}
