#include <bits/stdc++.h>
using namespace std;
int a[1 << 20];
int b[1 << 20];
pair<int, int> t[1 << 22];
void build(int p, int u, int node) {
  if (p == u)
    t[node] = {b[p], p};
  else {
    int m = (p + u) / 2;
    build(p, m, node << 1);
    build(m + 1, u, node << 1 | 1);
    t[node] = max(t[node << 1], t[node << 1 | 1]);
  }
}
void Del(int p, int u, int v, int node) {
  if (p == u)
    t[node] = {0, p};
  else {
    int m = (p + u) / 2;
    if (v <= m)
      Del(p, m, v, node << 1);
    else
      Del(m + 1, u, v, node << 1 | 1);
    t[node] = max(t[node << 1], t[node << 1 | 1]);
  }
}
pair<int, int> query(int p, int u, int l, int r, int node) {
  if (l > r) return {0, 0};
  if (l <= p && u <= r) return t[node];
  int m = (p + u) / 2;
  pair<int, int> ans = {0, 0};
  if (l <= m) ans = max(ans, query(p, m, l, r, node << 1));
  if (m + 1 <= r) ans = max(ans, query(m + 1, u, l, r, node << 1 | 1));
  return ans;
}
int was[1 << 20];
int n;
vector<int> Sort;
void dfs(int node) {
  Del(1, n, node, 1);
  was[node] = 1;
  if (b[node] != n + 1 && !was[b[node]]) dfs(b[node]);
  while (1) {
    auto it = query(1, n, 1, a[node] - 1, 1);
    if (it.first > node)
      dfs(it.second);
    else
      break;
  }
  Sort.push_back(node);
}
int ans[1 << 20];
int main(void) {
  scanf("%d\n", &n);
  for (int i = 1; i <= n; ++i) b[i] = n + 1;
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = 1; i <= n; ++i)
    if (a[i] != -1) b[a[i]] = i;
  for (int i = 1; i <= n; ++i)
    if (a[i] == -1) a[i] = n + 1;
  build(1, n, 1);
  for (int i = 1; i <= n; ++i)
    if (!was[i]) dfs(i);
  int cnt = 0;
  for (auto it : Sort) ans[it] = ++cnt;
  for (int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
  return 0;
}
