#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300100;
long long orig[MAXN];
int n;
pair<long long, long long> arr[MAXN];
long long larr, seg[MAXN], lseg;
string ans;
map<pair<long long, long long>, pair<long long, long long>> from_dp;
map<pair<long long, long long>,
    pair<pair<long long, long long>, pair<long long, long long>>>
    turn;
void UpdDp(const long long add_sum_to, const long long min_to_idx,
           const long long min_idx, const long long max_idx,
           const unordered_map<long long, long long>& dp,
           unordered_map<long long, long long>* nxt_dp) {
  for (const auto& it : dp) {
    long long add_sum = add_sum_to - it.first;
    for (int i = 0; i < min_to_idx - it.second; i++) {
      long long max_add =
          add_sum - 1ll * (n - min_to_idx + 1 + n - min_to_idx + i) * i / 2;
      long long min_add =
          add_sum - 1ll * (n - it.second - 1 + n - it.second - i) * i / 2;
      long long rmin_idx = max(min_idx, it.second + 1);
      if (max_add >= n - max_idx && min_add <= n - rmin_idx) {
        if (nxt_dp->find(add_sum_to) == nxt_dp->end()) {
          (*nxt_dp)[add_sum_to] = n;
        }
        long long& nxt = (*nxt_dp)[add_sum_to];
        long long nxt_val = max(n - max_add, rmin_idx);
        if (nxt > nxt_val) {
          nxt = nxt_val;
          from_dp[make_pair(add_sum_to, nxt_val)] = it;
          turn[make_pair(add_sum_to, nxt_val)] =
              make_pair(make_pair(it.second + 1, min_to_idx - 1),
                        make_pair(add_sum - n + nxt_val, i));
        }
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  long long last = 0;
  for (int i = 0; i < n; i++) {
    scanf("%I64d", orig + i);
    if (orig[i] != 0) {
      arr[larr++] = make_pair(orig[i], i);
      if (last < arr[larr - 1].first) {
        seg[lseg++] = larr - 1;
      }
      last = arr[larr - 1].first;
    }
  }
  arr[larr] = make_pair(-1, n);
  seg[lseg] = larr;
  ans = string(n, '0');
  unordered_map<long long, long long> dp[2];
  int now = 0, nxt = 1;
  dp[now][0] = -1;
  for (int i = 0; i < lseg; i++) {
    dp[nxt].clear();
    long long max_idx = arr[seg[i + 1]].second - 1;
    long long min_idx = arr[seg[i + 1] - 1].second + 1;
    if (arr[seg[i + 1] - 1].first < arr[seg[i]].first) {
      max_idx = arr[seg[i + 1] - 1].second;
      min_idx = max_idx;
    }
    UpdDp(arr[seg[i]].first - 1, arr[seg[i]].second, min_idx, max_idx, dp[now],
          &dp[nxt]);
    if (seg[i + 1] - seg[i] == 1) {
      UpdDp(arr[seg[i]].first, arr[seg[i]].second, arr[seg[i]].second,
            arr[seg[i]].second, dp[now], &dp[nxt]);
    }
    if (i + 1 == lseg && arr[seg[i]].first == arr[larr - 1].first) {
      for (long long j = seg[i] - 1; j < larr; j++) {
        if (arr[j + 1].second > arr[j].second + 1 || j == -1) {
          UpdDp(arr[seg[i]].first - 1, arr[seg[i]].second,
                (j == -1 ? 0 : arr[j].second + 1), arr[j + 1].second - 1,
                dp[now], &dp[nxt]);
        }
      }
    }
    if (i == lseg - 1 ||
        (i == lseg - 2 &&
         arr[seg[lseg - 1]].first - arr[seg[lseg - 1] - 1].first == 1)) {
      if (dp[nxt].size()) {
        for (pair<long long, long long> rfrom = *dp[nxt].begin();
             rfrom.first > 0; rfrom = from_dp[rfrom]) {
          ans[rfrom.second] = '1';
          const pair<pair<long long, long long>, pair<long long, long long>>&
              rturn = turn[rfrom];
          if (rturn.second.second) {
            long long cnt = rturn.second.second;
            long long sum = rturn.second.first;
            long long st = rturn.first.first, en = rturn.first.second;
            for (int j = st; j <= en && cnt; j++) {
              if (1ll * (n - en + n - en + cnt - 2) * (cnt - 1) / 2 <=
                  sum - n + j) {
                ans[j] = '1';
                sum -= n - j;
                cnt--;
              }
            }
          }
        }
        break;
      }
    }
    swap(now, nxt);
  }
  cout << ans << endl;
  return 0;
}
