#include <bits/stdc++.h>
using namespace std;
int a[500005], b[500005], nb[500005];
int n;
int t[500005 * 4];
bool bz[500005];
int ans[500005];
int pri[500005];
void build(int v, int l, int r) {
  if (l == r) {
    t[v] = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(v << 1, l, mid);
  build(v << 1 | 1, mid + 1, r);
  if (b[t[v << 1]] > b[t[v << 1 | 1]])
    t[v] = t[v << 1];
  else
    t[v] = t[v << 1 | 1];
}
int getwz(int v, int l, int r, int x, int y) {
  if (l == x && r == y) return t[v];
  int mid = (l + r) >> 1;
  if (y <= mid)
    return getwz(v << 1, l, mid, x, y);
  else if (x > mid)
    return getwz(v << 1 | 1, mid + 1, r, x, y);
  else {
    int ret1 = getwz(v << 1, l, mid, x, mid);
    int ret2 = getwz(v << 1 | 1, mid + 1, r, mid + 1, y);
    if (b[ret1] > b[ret2])
      return ret1;
    else
      return ret2;
  }
}
void change(int v, int l, int r, int x) {
  if (l == r) {
    b[x] = 0;
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    change(v << 1, l, mid, x);
  else
    change(v << 1 | 1, mid + 1, r, x);
  if (b[t[v << 1]] > b[t[v << 1 | 1]])
    t[v] = t[v << 1];
  else
    t[v] = t[v << 1 | 1];
}
void dfs(int x) {
  bz[x] = 1;
  change(1, 1, n, x);
  if (nb[x] != n + 1 && !bz[nb[x]]) dfs(nb[x]);
  for (; a[x] != 1;) {
    int wz = getwz(1, 1, n, 1, a[x] - 1);
    if (b[wz] <= x) break;
    dfs(wz);
  }
  ans[++ans[0]] = x;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    if (a[i] == -1) {
      a[i] = n + 1;
      continue;
    }
    b[a[i]] = i;
  }
  for (int i = 1; i <= n; i++)
    if (b[i] == 0) b[i] = n + 1;
  for (int i = 1; i <= n; i++) nb[i] = b[i];
  build(1, 1, n);
  for (int i = 1; i <= n; i++) {
    if (bz[i]) continue;
    dfs(i);
  }
  for (int i = 1; i <= n; i++) pri[ans[i]] = i;
  for (int i = 1; i <= n; i++) printf("%d ", pri[i]);
  return 0;
}
