#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
int n, a[N], b[N], vis[N];
namespace S {
pair<int, int> t[N << 2];
void build(int x, int l, int r) {
  if (l == r)
    t[x] = make_pair(b[l], l);
  else {
    build(x << 1, l, ((l + r) >> 1));
    build(x << 1 | 1, ((l + r) >> 1) + 1, r);
    t[x] = max(t[x << 1], t[x << 1 | 1]);
  }
}
pair<int, int> que(int x, int l, int r, int ql, int qr) {
  if (ql <= l && r <= qr)
    return t[x];
  else {
    if (qr <= ((l + r) >> 1)) return que(x << 1, l, ((l + r) >> 1), ql, qr);
    if (((l + r) >> 1) < ql)
      return que(x << 1 | 1, ((l + r) >> 1) + 1, r, ql, qr);
    return max(que(x << 1, l, ((l + r) >> 1), ql, qr),
               que(x << 1 | 1, ((l + r) >> 1) + 1, r, ql, qr));
  }
}
void del(int x, int l, int r, int p) {
  if (l == r)
    t[x] = make_pair(0, l);
  else {
    if (p <= ((l + r) >> 1))
      del(x << 1, l, ((l + r) >> 1), p);
    else
      del(x << 1 | 1, ((l + r) >> 1) + 1, r, p);
    t[x] = max(t[x << 1], t[x << 1 | 1]);
  }
}
}  // namespace S
int q[N], m, p[N];
void dfs(int u) {
  vis[u] = 1;
  S::del(1, 1, n, u);
  if (b[u] != n + 1 && !vis[b[u]]) dfs(b[u]);
  if (a[u] > 1)
    while (true) {
      pair<int, int> v = S::que(1, 1, n, 1, a[u] - 1);
      if (v.first > u)
        dfs(v.second);
      else
        break;
    }
  q[++m] = u;
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    a[i] = read();
    if (a[i] != -1)
      b[a[i]] = i;
    else
      a[i] = n + 1;
  }
  for (int i = 1; i <= n; i++)
    if (!b[i]) b[i] = n + 1;
  S::build(1, 1, n);
  for (int i = 1; i <= n; i++)
    if (!vis[i]) dfs(i);
  m = 0;
  for (int i = 1; i <= n; i++) p[q[i]] = ++m;
  for (int i = 1; i <= n; i++) printf("%d ", p[i]);
}
