#include <bits/stdc++.h>
using namespace std;
const int N = 500003, mod = 998244353;
template <typename T>
void read(T &x) {
  int ch = getchar();
  x = 0;
  bool f = false;
  for (; ch < '0' || ch > '9'; ch = getchar()) f |= ch == '-';
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  if (f) x = -x;
}
template <typename T>
bool chmax(T &a, const T &b) {
  if (a < b) return a = b, 1;
  return 0;
}
template <typename T>
bool chmin(T &a, const T &b) {
  if (a > b) return a = b, 1;
  return 0;
}
void qmo(int &x) { x += x >> 31 & mod; }
int ksm(int a, int b) {
  int res = 1;
  for (; b; b >>= 1, a = (long long)a * a % mod)
    if (b & 1) res = (long long)res * a % mod;
  return res;
}
int n, a[N], b[N], m, p[N], q[N];
pair<int, int> seg[N << 2];
void pup(int x) { seg[x] = max(seg[x << 1], seg[x << 1 | 1]); }
void build(int x = 1, int L = 1, int R = n) {
  if (L == R) {
    seg[x] = make_pair(b[L], L);
    return;
  }
  int mid = L + R >> 1;
  build(x << 1, L, mid);
  build(x << 1 | 1, mid + 1, R);
  pup(x);
}
void del(int p, int x = 1, int L = 1, int R = n) {
  if (L == R) {
    seg[x] = make_pair(0, L);
    return;
  }
  int mid = L + R >> 1;
  if (p <= mid)
    del(p, x << 1, L, mid);
  else
    del(p, x << 1 | 1, mid + 1, R);
  pup(x);
}
pair<int, int> qry(int l, int r, int x = 1, int L = 1, int R = n) {
  if (l <= L && R <= r) return seg[x];
  int mid = L + R >> 1;
  if (r <= mid) return qry(l, r, x << 1, L, mid);
  if (mid < l) return qry(l, r, x << 1 | 1, mid + 1, R);
  return max(qry(l, r, x << 1, L, mid), qry(l, r, x << 1 | 1, mid + 1, R));
}
bool vis[N];
void dfs(int u) {
  vis[u] = true;
  del(u);
  if (b[u] <= n && !vis[b[u]]) dfs(b[u]);
  if (a[u] > 1)
    while (true) {
      pair<int, int> tmp = qry(1, a[u] - 1);
      if (tmp.first > u)
        dfs(tmp.second);
      else
        break;
    }
  q[++m] = u;
}
int main() {
  read(n);
  for (int i = 1; i <= n; ++i) {
    read(a[i]);
    if (~a[i])
      b[a[i]] = i;
    else
      a[i] = n + 1;
  }
  for (int i = 1; i <= n; ++i)
    if (!b[i]) b[i] = n + 1;
  build();
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) dfs(i);
  for (int i = 1; i <= n; ++i) p[q[i]] = i;
  for (int i = 1; i <= n; ++i) printf("%d%c", p[i], " \n"[i == n]);
}
