#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int sum = 0;
  char c = getchar();
  bool f = 0;
  while (c < '0' || c > '9') {
    if (c == '-') f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  if (f) return -sum;
  return sum;
}
const int N = 500005;
const int orz = 2000000000;
int n, a[N], b[N], t[N * 4];
inline int maxt(int x, int y) { return b[x] > b[y] ? x : y; }
inline void build(int p, int l, int r) {
  if (l == r) {
    t[p] = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  t[p] = maxt(t[p << 1], t[p << 1 | 1]);
}
int at;
inline void del(int p, int l, int r) {
  if (l == r) {
    b[l] = -orz;
    return;
  }
  int mid = (l + r) >> 1;
  if (at <= mid)
    del(p << 1, l, mid);
  else
    del(p << 1 | 1, mid + 1, r);
  t[p] = maxt(t[p << 1], t[p << 1 | 1]);
}
bool vis[N];
int dfn[N], cnt;
inline int ask(int p, int l, int r, int L, int R) {
  if (l == L && r == R) return t[p];
  int mid = (l + r) >> 1;
  if (R <= mid)
    return ask(p << 1, l, mid, L, R);
  else if (L > mid)
    return ask(p << 1 | 1, mid + 1, r, L, R);
  else
    return maxt(ask(p << 1, l, mid, L, mid),
                ask(p << 1 | 1, mid + 1, r, mid + 1, R));
}
inline void dfs(int k) {
  if (vis[k]) return;
  vis[k] = 1;
  if (b[k] != orz) dfs(b[k]);
  at = k;
  del(1, 1, n);
  if (a[k] != 1) {
    int y = a[k] - 1, x = ask(1, 1, n, 1, y);
    while (b[x] > k) dfs(x), x = ask(1, 1, n, 1, y);
  }
  dfn[k] = ++cnt;
}
int main() {
  int i, j;
  n = read();
  for (i = 1; i <= n; i++) b[i] = orz;
  for (i = 1; i <= n; i++) {
    a[i] = read();
    if (a[i] != -1)
      b[a[i]] = i;
    else
      a[i] = n + 1;
  }
  build(1, 1, n);
  for (i = 1; i <= n; i++)
    if (!vis[i]) dfs(i);
  for (i = 1; i <= n; i++) printf("%d ", dfn[i]);
  return 0;
}
