#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
const int mxN = 500010;
bool visited[mxN];
int a[mxN];
int rev[mxN];
int N;
pair<int, int> tree[4 * mxN];
void build(int n = 1, int l = 1, int r = N) {
  if (l == r) {
    tree[n] = {rev[l], l};
    return;
  }
  int md = (l + r) >> 1;
  build(n << 1, l, md);
  build(n << 1 | 1, md + 1, r);
  tree[n] = max(tree[n << 1], tree[n << 1 | 1]);
}
int ind;
pair<int, int> val;
void upd(int n = 1, int l = 1, int r = N) {
  if (l == r) {
    tree[n] = val;
    return;
  }
  int md = (l + r) >> 1;
  if (ind <= md)
    upd(n << 1, l, md);
  else
    upd(n << 1 | 1, md + 1, r);
  tree[n] = max(tree[n << 1], tree[n << 1 | 1]);
}
pair<int, int> get(int a, int b, int n = 1, int l = 1, int r = N) {
  if (l == a && b == r) {
    return tree[n];
  }
  int md = (l + r) >> 1;
  pair<int, int> res = {0, 0};
  if (a <= md) res = max(res, get(a, min(b, md), n << 1, l, md));
  if (b > md) res = max(res, get(max(a, md + 1), b, n << 1 | 1, md + 1, r));
  return res;
}
vector<int> topo;
int res[500010];
void dfs(int v) {
  visited[v] = true;
  ind = v;
  val = {0, v};
  upd();
  if (rev[v] <= N && !visited[rev[v]]) {
    dfs(rev[v]);
  }
  while (true) {
    pair<int, int> p = get(1, a[v]);
    if (p.first <= v) {
      break;
    }
    dfs(p.second);
  }
  topo.push_back(v);
  res[v] = topo.size();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> N;
  for (int i = 1; i <= N; i++) {
    cin >> a[i];
    if (a[i] != -1)
      rev[a[i]] = i;
    else
      a[i] = N;
  }
  for (int i = 1; i <= N; i++) {
    ind = i;
    if (rev[i] == 0) rev[i] = INT_MAX;
    val = {rev[i], i};
  }
  build();
  for (int i = 1; i <= N; i++) {
    if (!visited[i]) dfs(i);
  }
  for (int i = 1; i <= N; i++) {
    cout << res[i] << " \n"[i == N];
  }
  return 0;
}
