#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 100;
int INF;
int a[MAXN], b[MAXN], ans[MAXN];
bool used[MAXN];
vector<int> v[MAXN];
int n, c = 1;
struct SegTree {
  pair<int, int> t[MAXN * 4];
  void upd(int ind, int L = 0, int R = n - 1, int v = 1) {
    if (ind == L && ind == R) {
      t[v] = {0, ind};
    } else {
      int m = (L + R) / 2;
      if (ind <= m) upd(ind, L, m, v * 2);
      if (ind > m) upd(ind, m + 1, R, v * 2 + 1);
      t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
  }
  pair<int, int> getAns(int l, int r, int L = 0, int R = n - 1, int v = 1) {
    if (l == L && r == R) {
      return t[v];
    } else {
      int m = (L + R) / 2;
      pair<int, int> ans = {0, 0};
      if (l <= m) ans = max(ans, getAns(l, min(r, m), L, m, v * 2));
      if (r > m) ans = max(ans, getAns(max(l, m + 1), r, m + 1, R, v * 2 + 1));
      return ans;
    }
  }
  void build(int v, int l, int r) {
    if (l == r) {
      t[v] = {b[l], l};
    } else {
      int m = (l + r) / 2;
      build(v * 2, l, m);
      build(v * 2 + 1, m + 1, r);
      t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
  }
};
SegTree str;
void dfs(int node) {
  used[node] = 1;
  str.upd(node);
  if (b[node] != INF && !used[b[node]]) dfs(b[node]);
  if (a[node] > 0) {
    pair<int, int> m = str.getAns(0, a[node] - 1);
    while (m.first > node) {
      dfs(m.second);
      m = str.getAns(0, a[node] - 1);
    }
  }
  ans[node] = c;
  c++;
}
int main() {
#pragma warning(disable : 4996)
  scanf("%d", &n);
  INF = n;
  for (int i = 0; i < n; i++) b[i] = INF;
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    a[i]--;
    if (a[i] == -2)
      a[i] = INF;
    else {
      b[a[i]] = i;
    }
  }
  str.build(1, 0, n - 1);
  for (int i = 0; i < n; i++) {
    if (!used[i]) dfs(i);
  }
  for (int i = 0; i < n; i++) printf("%d ", ans[i]);
  return 0;
}
