#include <bits/stdc++.h>
using namespace std;
int n;
int a[500000 + 1];
int b[500000 + 1];
int viz[500000 + 1];
int k;
int top[500000 + 1];
int rez[500000 + 1];
void readFile() {
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
}
struct elem {
  int mx, poz;
};
elem zero = {0, 0};
elem arb[(500000 << 2) + 1];
elem mxa(elem a, elem b) {
  if (a.mx == b.mx) return (a.poz < b.poz ? a : b);
  return (a.mx > b.mx ? a : b);
}
void upd(int poz, int st, int dr, int a, int nr) {
  if (st == a && dr == a) {
    arb[poz] = {nr, a};
    return;
  }
  int mid = (dr + st) >> 1;
  if (a <= mid) upd(poz << 1, st, mid, a, nr);
  if (a > mid) upd((poz << 1) + 1, mid + 1, dr, a, nr);
  if (st <= mid) arb[poz] = arb[poz << 1];
  if (mid + 1 <= dr) arb[poz] = mxa(arb[poz], arb[(poz << 1) + 1]);
}
elem getMax(int poz, int st, int dr, int a, int b) {
  if (st == a && dr == b) {
    return arb[poz];
  }
  int mid = (st + dr) >> 1;
  if (b <= mid) return getMax(poz << 1, st, mid, a, b);
  if (a > mid) return getMax((poz << 1) + 1, mid + 1, dr, a, b);
  if (a <= mid && b > mid) {
    elem s = getMax(poz << 1, st, mid, a, mid);
    elem d = getMax((poz << 1) + 1, mid + 1, dr, mid + 1, b);
    return mxa(s, d);
  }
  cout << "ERROR\n";
  return zero;
}
int tmp[500000 + 1];
void dfs(int i) {
  viz[i] = 1;
  upd(1, 1, n, i, 0);
  if (b[i] >= 1 && b[i] <= n && viz[b[i]] == -1) {
    dfs(b[i]);
  }
  if (a[i] - 1 > 0) {
    elem x = getMax(1, 1, n, 1, a[i] - 1);
    while (x.mx > i) {
      dfs(x.poz);
      x = getMax(1, 1, n, 1, a[i] - 1);
    }
  }
  tmp[++k] = i;
}
void doRev() {
  for (int i = 1; i <= n; i++) {
    top[i] = tmp[n - i + 1];
  }
}
void solve() {
  for (int i = 1; i <= n; i++) b[i] = n + 1;
  for (int i = 1; i <= n; i++) {
    if (a[i] == -1)
      a[i] = n + 1;
    else
      b[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) upd(1, 1, n, i, b[i]);
  for (int i = 1; i <= n; i++) viz[i] = -1;
  for (int i = 1; i <= n; i++) {
    if (viz[i] == -1) dfs(i);
  }
  doRev();
  for (int i = 1; i <= n; i++) rez[tmp[i]] = i;
}
void printFile() {
  for (int i = 1; i <= n; i++) cout << rez[i] << " ";
  cout << "\n";
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  readFile();
  solve();
  printFile();
  return 0;
}
