#include <bits/stdc++.h>
using namespace std;
struct _t {
  int x, p;
};
const int sz = 5e5 + 100;
_t t[sz * 4];
vector<int> a, b, ans;
vector<bool> used;
int n, cnt = 1;
_t maxt(_t a, _t b) {
  if (a.x > b.x)
    return a;
  else
    return b;
}
void build(int v, int l, int r) {
  if (l == r)
    t[v] = {b[l], l};
  else {
    int mid = (l + r) / 2;
    build((v << 1), l, mid);
    build((v << 1) + 1, mid + 1, r);
    t[v] = maxt(t[v << 1], t[(v << 1) + 1]);
    return;
  }
}
void del(int v, int l, int r, int p) {
  if (l == r && l == p)
    t[v] = {0, 0};
  else {
    int mid = (l + r) >> 1;
    if (p <= mid)
      del(v << 1, l, mid, p);
    else
      del((v << 1) + 1, mid + 1, r, p);
    t[v] = maxt(t[v << 1], t[(v << 1) + 1]);
  }
}
_t get(int v, int l, int r, int ll, int rr) {
  if (ll > rr) return {0, 0};
  if (l == ll && r == rr) return t[v];
  int mid = (l + r) >> 1, pl = v << 1, pr = pl + 1;
  if (rr <= mid) return get(pl, l, mid, ll, rr);
  if (ll > mid) return get(pr, mid + 1, r, ll, rr);
  return maxt(get(pl, l, mid, ll, mid), get(pr, mid + 1, r, mid + 1, rr));
}
void dfs(int v) {
  used[v] = true;
  del(1, 1, n, v);
  if (b[v] != n + 1 && !used[b[v]]) dfs(b[v]);
  for (_t to = get(1, 1, n, 1, a[v] - 1); to.x > v;
       to = get(1, 1, n, 1, a[v] - 1))
    dfs(to.p);
  ans[v] = cnt++;
}
int main() {
  ios_base::sync_with_stdio(false);
  int i;
  cin >> n;
  a.resize(n + 1);
  b.resize(n + 1);
  ans.resize(n + 1);
  used.resize(n + 1);
  for (i = 1; i <= n; i++) b[i] = n + 1;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] != -1)
      b[a[i]] = i;
    else
      a[i] = n + 1;
  }
  build(1, 1, n);
  for (i = 1; i <= n; i++)
    if (!used[i]) dfs(i);
  for (i = 1; i <= n; i++) cout << ans[i] << " ";
}
