#include <bits/stdc++.h>
using namespace std;
struct SegmentTreeNode {
  int l, r, v, a;
};
class SegmentTree {
 public:
  SegmentTree(const vector<int> &v) {
    t = std::vector<SegmentTreeNode>(v.size() * 4);
    BuildTree(v, 1, v.size() - 1, 0);
  }
  pair<int, int> Query(int l, int r, int x = 0) {
    if (l > t[x].r || r < t[x].l) return make_pair(INT_MIN, 0);
    if (l <= t[x].l && r >= t[x].r) return make_pair(t[x].v, t[x].a);
    auto p1 = Query(l, r, x * 2 + 1);
    auto p2 = Query(l, r, x * 2 + 2);
    return p1.first > p2.first ? p1 : p2;
  }
  void Modify(int m, int v, int x = 0) {
    if (m < t[x].l || m > t[x].r) return;
    if (m == t[x].l && m == t[x].r) {
      t[x].v = v;
      return;
    }
    Modify(m, v, x * 2 + 1);
    Modify(m, v, x * 2 + 2);
    if (t[x * 2 + 1].v > t[x * 2 + 2].v) {
      t[x].v = t[x * 2 + 1].v;
      t[x].a = t[x * 2 + 1].a;
    } else {
      t[x].v = t[x * 2 + 2].v;
      t[x].a = t[x * 2 + 2].a;
    }
  }

 private:
  void BuildTree(const vector<int> &v, int l, int r, int x) {
    t[x].l = l, t[x].r = r;
    if (l == r) {
      t[x].v = v[l];
      t[x].a = l;
    } else {
      int m = (l + r) / 2;
      BuildTree(v, l, m, x * 2 + 1);
      BuildTree(v, m + 1, r, x * 2 + 2);
      if (t[x * 2 + 1].v > t[x * 2 + 2].v) {
        t[x].v = t[x * 2 + 1].v;
        t[x].a = t[x * 2 + 1].a;
      } else {
        t[x].v = t[x * 2 + 2].v;
        t[x].a = t[x * 2 + 2].a;
      }
    }
  }
  vector<SegmentTreeNode> t;
};
void dfs(int id, vector<bool> &v, SegmentTree &st, vector<int> &seq,
         const vector<int> &a, const vector<int> &b) {
  v[id] = true;
  st.Modify(id, 0);
  if (b[id] && b[id] < b.size() && !v[b[id]]) dfs(b[id], v, st, seq, a, b);
  if (a[id] > 1)
    for (;;) {
      auto p = st.Query(1, a[id] - 1);
      if (p.first > id && p.second != id) {
        if (!v[p.second]) dfs(p.second, v, st, seq, a, b);
      } else
        break;
    }
  seq.push_back(id);
}
int main() {
  int n;
  scanf("%d", &n);
  vector<int> a(n + 1), b(n + 1, n + 1);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++)
    if (a[i] > 0)
      b[a[i]] = i;
    else
      a[i] = n + 1;
  SegmentTree st(b);
  vector<bool> v(n + 1, false);
  vector<int> seq;
  for (int i = 1; i <= n; i++)
    if (!v[i]) dfs(i, v, st, seq, a, b);
  vector<int> ans(n + 1);
  for (int i = 0; i < seq.size(); i++) ans[seq[i]] = i + 1;
  for (int i = 1; i <= n; i++) {
    if (i > 1) printf(" ");
    printf("%d", ans[i]);
  }
  printf("\n");
  return 0;
}
