#include <bits/stdc++.h>
using namespace std;
const int N = 500010;
struct SegTree {
  int seg[4 * N + 1], n, a, b, k;
  SegTree() {}
  SegTree(int n) : n(n) { memset(seg, 0, sizeof seg); }
  int query(int r, int i, int j) {
    if (i > b or j < a) return 0;
    if (i >= a and j <= b) {
      if (k == -1) return seg[r];
      return seg[r] = k;
    }
    int mid = (i + j) / 2;
    int le = query(r * 2, i, mid);
    int ri = query(r * 2 + 1, mid + 1, j);
    seg[r] = max(seg[r * 2], seg[r * 2 + 1]);
    return max(le, ri);
  }
  int get_id(int r, int i, int j) {
    if (i > b or j < a) return -1;
    int mid = (i + j) / 2;
    if (i >= a and j <= b) {
      if (i == j and seg[r] == k) return i;
      if (i == j) return -1;
      if (seg[r * 2] == k) return get_id(r * 2, i, mid);
      return get_id(r * 2 + 1, mid + 1, j);
    }
    return max(get_id(r * 2, i, mid), get_id(r * 2 + 1, mid + 1, j));
  }
  void update(int x, int y) {
    a = b = x;
    k = y;
    query(1, 0, n);
  }
  int query(int x, int y) {
    a = x;
    b = y;
    k = -1;
    return query(1, 0, n);
  }
  int get(int x, int y, int z) {
    a = x;
    b = y;
    k = z;
    return get_id(1, 0, n);
  }
} st;
int a[N], b[N], ans[N], n, g[N];
vector<int> topo;
void dfs(int u) {
  st.update(u, 0);
  if (b[u] != n + 1 and st.query(b[u], b[u])) {
    dfs(b[u]);
  }
  while (true) {
    int valor = st.query(1, a[u] - 1);
    if (valor <= u) break;
    int v = st.get(1, a[u] - 1, valor);
    dfs(v);
  }
  topo.push_back(u);
}
int main(void) {
  scanf("%d", &n);
  st = SegTree(n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    if (a[i] == -1) a[i] = n + 1;
    b[i] = n + 1;
  }
  for (int i = 1; i <= n; i++) b[a[i]] = i;
  for (int i = 1; i <= n; i++) st.update(i, b[i]);
  for (int i = 1; i <= n; i++) {
    if (st.query(i, i)) dfs(i);
  }
  for (int i = 0; i < n; i++) {
    ans[topo[i]] = i + 1;
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  cout << endl;
  return 0;
}
