#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
template <class T, class U>
inline void Max(T &a, U b) {
  if (a < b) a = b;
}
template <class T, class U>
inline void Min(T &a, U b) {
  if (a > b) a = b;
}
inline void add(int &a, int b) {
  a += b;
  while (a >= 1000000007) a -= 1000000007;
}
int pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = ans * (long long)a % 1000000007;
    a = (long long)a * a % 1000000007;
    b >>= 1;
  }
  return ans;
}
int a[500005], b[500005], v[500005], is[500005], n;
pair<int, int> t[500005 << 2];
vector<int> res;
void build(int p, int l, int r) {
  if (l == r) {
    t[p] = {v[l], l};
    return;
  }
  int m = (l + r) >> 1;
  build(p << 1, l, m);
  build(p << 1 | 1, m + 1, r);
  t[p] = max(t[p << 1], t[p << 1 | 1]);
}
void del(int p, int l, int r, int first) {
  if (l == r) {
    t[p] = {0, l};
    return;
  }
  int m = (l + r) >> 1;
  if (first <= m)
    del(p << 1, l, m, first);
  else
    del(p << 1 | 1, m + 1, r, first);
  t[p] = max(t[p << 1], t[p << 1 | 1]);
}
pair<int, int> query(int p, int l, int r, int first, int second) {
  if (first > second) return {0, 0};
  if (l >= first && r <= second) return t[p];
  int m = (l + r) >> 1;
  pair<int, int> a = {0, 0}, b = {0, 0};
  if (first <= m) a = query(p << 1, l, m, first, second);
  if (second > m) b = query(p << 1 | 1, m + 1, r, first, second);
  if (a.first >= b.first) return a;
  return b;
}
void dfs(int u) {
  is[u] = 1;
  del(1, 1, n, u);
  if (v[u] <= n && !is[v[u]]) dfs(v[u]);
  while (1) {
    pair<int, int> e = query(1, 1, n, 1, a[u] - 1);
    if (e.first > u)
      dfs(e.second);
    else
      break;
  }
  res.push_back(u);
}
int main() {
  int T, i, j, k, ca = 0, m, K;
  scanf("%d", &n);
  for (int i = 1; i < n + 1; i++) v[i] = n + 1;
  for (int i = 1; i < n + 1; i++) {
    scanf("%d", &a[i]);
    if (a[i] != -1) v[a[i]] = i;
  }
  for (int i = 1; i < n + 1; i++)
    if (a[i] == -1) a[i] = n + 1;
  build(1, 1, n);
  for (int i = 1; i < n + 1; i++)
    if (!is[i]) dfs(i);
  K = 0;
  for (auto first : res) b[first] = ++K;
  for (int i = 1; i < n + 1; i++) printf("%d ", b[i]);
  puts("");
  return 0;
}
