#include <bits/stdc++.h>
const int N = 500005;
std::pair<int, int> max[N << 2];
int n, a[N], b[N];
void pushup(int o) { max[o] = std::max(max[o << 1], max[o << 1 | 1]); }
void build(int o = 1, int l = 1, int r = n) {
  if (l == r) {
    max[o] = {b[l], l};
    return;
  }
  int mid = l + r >> 1;
  build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r);
  pushup(o);
}
void remove(int pos, int o = 1, int l = 1, int r = n) {
  if (l == r) {
    max[o] = {-1, 0};
    return;
  }
  int mid = l + r >> 1;
  if (pos <= mid)
    remove(pos, o << 1, l, mid);
  else
    remove(pos, o << 1 | 1, mid + 1, r);
  pushup(o);
}
std::pair<int, int> query(int pos, int o = 1, int l = 1, int r = n) {
  if (pos == r) return max[o];
  int mid = l + r >> 1;
  if (pos <= mid)
    return query(pos, o << 1, l, mid);
  else
    return std::max(max[o << 1], query(pos, o << 1 | 1, mid + 1, r));
}
bool vis[N];
int idx, ans[N];
void dfs(int x) {
  if (vis[x]) return;
  vis[x] = 1, remove(x);
  if (b[x] != n + 1) dfs(b[x]);
  if (a[x] > 1)
    for (auto v = query(a[x] - 1); v.first > x;)
      dfs(v.second), v = query(a[x] - 1);
  ans[x] = ++idx;
}
int main() {
  std::ios::sync_with_stdio(0), std::cin.tie(0);
  std::cin >> n;
  for (int i = 1; i <= n; ++i) b[i] = n + 1;
  for (int i = 1; i <= n; ++i) {
    std::cin >> a[i];
    if (a[i] == -1)
      a[i] = n + 1;
    else
      b[a[i]] = i;
  }
  build();
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) dfs(i);
  for (int i = 1; i <= n; ++i) std::cout << ans[i] << ' ';
  return 0;
}
