func_code_string: #include <bits/stdc++.h>   using namespace std;   int inf = -1e9;   struct node {     int low;     int high;     pair<int, int> val;     node() : val(make_pair(inf, 0)) {}     node(int _l, int _h) : low(_l), high(_h), val(make_pair(inf, 0)) {}     node(int _l, int _h, pair<int, int> _v) : low(_l), high(_h), val(_v) {}   };   int N = 1 << 19;   vector<node> seg(2 * N);   void initSeg(vector<pair<int, int>> vals) {     int len = vals.size();     for (int i = 0; i < len; ++i) {       seg[N + i].val = vals[i];       seg[N + i].low = i;       seg[N + i].high = i + 1;     }     for (int i = len; i < N; ++i) {       seg[N + i].low = i;       seg[N + i].high = i + 1;     }     for (int i = N - 1; i > 0; --i) {       seg[i].val = max(seg[2 * i].val, seg[2 * i + 1].val);       seg[i].low = seg[2 * i].low;       seg[i].high = seg[2 * i + 1].high;     }   }   pair<int, int> querySeg(int index, int low, int high) {     if (low <= seg[index].low && seg[index].high <= high) return seg[index].val;     if (seg[index].high <= low || high <= seg[index].low)       return make_pair(inf, 0);     return max(querySeg(2 * index, low, high),                querySeg(2 * index + 1, low, high));   }   pair<int, int> updateSeg(int index, int low, int high, pair<int, int> val) {     if (low <= seg[index].low && seg[index].high <= high) {       seg[index].val = val;       return val;     }     if (seg[index].high <= low || high <= seg[index].low) return seg[index].val;     pair<int, int> left = updateSeg(2 * index, low, high, val);     pair<int, int> right = updateSeg(2 * index + 1, low, high, val);     seg[index].val = max(left, right);     return seg[index].val;   }   vector<int> seq;   vector<int> a;   vector<pair<int, int>> b;   vector<bool> toVisit;   int n;   void dfs(int index) {     toVisit[index] = false;     updateSeg(1, index, index + 1, make_pair(inf, 0));     if (b[index].first < n && toVisit[b[index].first]) dfs(b[index].first);     while (true) {       pair<int, int> p = querySeg(1, 0, a[index]);       if (p.first > index)         dfs(p.second);       else         break;     }     seq.push_back(index);   }   int main() {     int Test = 1;     for (int test = 1; test <= Test; ++test) {       cin >> n;       a.clear();       b.clear();       seq.clear();       toVisit.clear();       for (int i = 0; i < n; ++i) {         int in;         cin >> in;         if (in == -1) in = n + 1;         a.push_back(in - 1);       }       for (int i = 0; i < n; ++i) {         b.push_back(make_pair(n, i));         toVisit.push_back(true);       }       for (int i = 0; i < n; ++i) {         if (a[i] == n) continue;         b[a[i]].first = i;       }       initSeg(b);       for (int i = 0; i < n; ++i) {         if (toVisit[i]) dfs(i);       }       int ans[n];       for (int i = 0; i < n; ++i) {         ans[seq[i]] = i + 1;       }       for (int i = 0; i < n; ++i) {         cout << ans[i] <<    ;       }       cout << endl;     }     return 0;   }   