#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAXN = 500005;
template <typename T>
void read(T &x) {
  T flag = 1;
  char ch = getchar();
  for (; '0' > ch || ch > '9'; ch = getchar())
    if (ch == '-') flag = -1;
  for (x = 0; '0' <= ch && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  x *= flag;
}
int mx[MAXN << 2];
int n;
int a[MAXN], b[MAXN];
void push_up(int p) { mx[p] = max(mx[p << 1], mx[p << 1 | 1]); }
void build(int p, int l, int r) {
  if (l == r) {
    mx[p] = b[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
  push_up(p);
}
int ask(int p, int l, int r, int x, int y, int v) {
  if (x > y) return -1;
  if (l > y || r < x) return -1;
  if (mx[p] <= v) return -1;
  if (l == r) return l;
  int mid = (l + r) >> 1;
  int L = ask(p << 1, l, mid, x, y, v);
  if (L == -1)
    return ask(p << 1 | 1, mid + 1, r, x, y, v);
  else
    return L;
}
void change(int p, int l, int r, int x) {
  if (l == r) {
    mx[p] = -1;
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    change(p << 1, l, mid, x);
  else
    change(p << 1 | 1, mid + 1, r, x);
  push_up(p);
}
int vis[MAXN], num;
void dfs(int x) {
  if (b[x] <= n && !vis[b[x]]) dfs(b[x]);
  int y = ask(1, 1, n, 1, a[x] - 1, x), lst;
  while (y != -1) {
    lst = y;
    if (y != x) {
      dfs(y);
    }
    y = ask(1, 1, n, lst + 1, a[x] - 1, x);
  }
  change(1, 1, n, x);
  vis[x] = ++num;
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) {
    read(a[i]);
    if (a[i] == -1)
      a[i] = n + 1;
    else
      b[a[i]] = i;
  }
  for (int i = 1; i <= n; i++)
    if (b[i] == 0) b[i] = n + 1;
  build(1, 1, n);
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) dfs(i);
  }
  for (int i = 1; i <= n; i++) printf("%d ", vis[i]);
  return 0;
}
