func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n;     vector<long long> a;     vector<int> pos;     for (int i = n; i > 0; i--) {       long long p;       cin >> p;       if (p == 0) continue;       a.push_back(p);       pos.push_back(i);     }     reverse(a.begin(), a.end());     reverse(pos.begin(), pos.end());     if (a.empty()) {       cout << string(n,  0 );       return 0;     }     int sz = a.size();     vector<int> last_id(sz);     for (int i = sz - 1; i >= 0; i--) {       if (i < sz - 1 && a[i] == a[i + 1])         last_id[i] = last_id[i + 1];       else         last_id[i] = i;     }     auto get_sum = [&](int l, int r) {       return 1LL * r * (r + 1) / 2 - 1LL * (l - 1) * l / 2;     };     auto solve = [&](long long sum, int l, int r) {       vector<pair<int, int>> res;       if (sum == 0) return res;       if (l > r) {         res = {{-1, -1}};         return res;       }       if (sum < 0 || sum > get_sum(l, r)) {         res = {{-1, -1}};         return res;       }       if (sum == get_sum(l, r)) {         res.emplace_back(l, r);         return res;       }       int lo = 0, hi = r - l + 1;       while (hi - lo > 1) {         int mid = (hi + lo) >> 1;         if (sum >= get_sum(l, l + mid - 1))           lo = mid;         else           hi = mid;       }       int st = lo;       if (sum > get_sum(r - st + 1, r)) {         res = {{-1, -1}};         return res;       }       int skip = r - (l + st - 1);       long long add = sum - get_sum(l, l + st - 1);       int cnt = add / skip;       pair<int, int> a = {l, l + st - 1 - cnt};       pair<int, int> b = {r - cnt + 1, r};       if (add > skip * cnt) {         int c = a.second;         a.second--;         c += add - 1LL * skip * cnt;         res.push_back({c, c});       }       if (a.first <= a.second) res.push_back(a);       if (b.first <= b.second) res.push_back(b);       return res;     };     auto check = [&](vector<pair<int, int>> foo) {       return !(foo.size() == 1 && foo[0] == make_pair(-1, -1));     };     vector<long long> supose(n + 1);     for (int i = n; i > 0; i--) {       int p = lower_bound(pos.begin(), pos.end(), i) - pos.begin();       if (pos[p] == i)         supose[i] = a[p];       else         supose[i] = a[p] - 1;     }     vector<bool> dp(n + 1);     vector<int> par(n + 1);     vector<vector<pair<int, int>>> aux_seg(n + 1);     vector<int> last_true(sz);     int go_from = pos.back();     auto add = [&](int from, int to, int l, int r) {       long long sum = supose[from] - from;       if (to <= n) sum -= supose[to];       auto foo = solve(sum, l, r);       if (check(foo)) {         dp[from] = true;         par[from] = to;         aux_seg[from] = foo;       }     };     for (int cur = go_from; cur > 0; cur--) {       int p = lower_bound(pos.begin(), pos.end(), cur) - pos.begin();       if (pos[p] == cur && p < sz - 1) {         if (a[p] == a[p + 1]) continue;         if (a[p] == a[p + 1] - 1) {           int np = last_id[p + 1];           if (np == sz - 1 || dp[pos[np + 1]]) {             int l = pos[np] + 1;             int r = np == sz - 1 ? n : pos[np + 1] - 1;             add(cur, r + 1, l, r);           }           if (last_true[np]) {             int l = pos[np] + 1;             int r = last_true[np] - 1;             add(cur, r + 1, l, r);           }         }       }       int np = last_id[p];       if (np == sz - 1 || dp[pos[np + 1]]) {         int l = pos[np] + 1;         int r = np == sz - 1 ? n : pos[np + 1] - 1;         add(cur, r + 1, l, r);       }       if (last_true[np]) {         int l = pos[np] + 1;         int r = last_true[np] - 1;         add(cur, r + 1, l, r);       }       if (pos[p] != cur && p && !last_true[p - 1] && dp[cur]) {         last_true[p - 1] = cur;       }     }     string res(n + 1,  0 );     long long bound = -1;     for (int i = 1; i <= n; i++) {       if (dp[i] && (bound == -1 || supose[i] == bound - 1)) {         while (i <= n) {           res[i] =  1 ;           for (auto foo : aux_seg[i]) {             for (int j = foo.first; j <= foo.second; j++) res[j] =  1 ;           }           i = par[i];         }         break;       }       if (pos[0] == i) {         bound = a[0];       }     }     res.erase(res.begin());     reverse(res.begin(), res.end());     cout << res;     return 0;   }   