#include <bits/stdc++.h>
using namespace std;
inline void R(int &v) {
  static char ch;
  v = 0;
  bool p = 0;
  do {
    ch = getchar();
    if (ch == '-') p = 1;
  } while (!isdigit(ch));
  while (isdigit(ch)) {
    v = (v + (v << 2) << 1) + (ch ^ '0');
    ch = getchar();
  }
  if (p) v = -v;
}
int a[500005], b[500005];
int n;
struct tree {
  int max, pos;
} tr[2000005];
inline void updata(int x) {
  if (tr[x << 1].max < tr[x << 1 | 1].max) {
    tr[x] = tr[x << 1 | 1];
  } else {
    tr[x] = tr[x << 1];
  }
}
inline void build(int x, int l, int r) {
  if (l == r) {
    tr[x].pos = l;
    tr[x].max = b[l];
    return;
  }
  int mid = l + r >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  updata(x);
}
bool vis[500005];
inline pair<int, int> Max(pair<int, int> a, pair<int, int> b) {
  if (a.first == b.first) return a;
  if (a.first > b.first)
    return a;
  else
    return b;
}
inline pair<int, int> query(int x, int ql, int qr, int l, int r) {
  if (l >= ql && r <= qr) {
    return pair<int, int>{tr[x].max, tr[x].pos};
  }
  int mid = l + r >> 1, ret = 0, pos;
  pair<int, int> temp = pair<int, int>{0, 0};
  if (ql > qr) return temp;
  if (ql <= mid) temp = Max(temp, query(x << 1, ql, qr, l, mid));
  if (qr > mid) temp = Max(temp, query(x << 1 | 1, ql, qr, mid + 1, r));
  return temp;
}
inline void modify(int x, int pos, int l, int r) {
  if (l == r) {
    tr[x].max = 0;
    return;
  }
  int mid = l + r >> 1;
  if (pos <= mid)
    modify(x << 1, pos, l, mid);
  else
    modify(x << 1 | 1, pos, mid + 1, r);
  updata(x);
  return;
}
int p[500005], ans[500005];
int tot;
inline void dfs(int x) {
  modify(1, x, 1, n);
  vis[x] = 1;
  if (b[x] != n + 1 && !vis[b[x]]) dfs(b[x]);
  pair<int, int> pos;
  while (1) {
    pos = query(1, 1, a[x] - 1, 1, n);
    if (pos.first <= x)
      break;
    else
      dfs(pos.second);
  }
  p[++tot] = x;
}
int main() {
  R(n);
  for (int i = 1; i <= n; ++i) {
    R(a[i]);
    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;
  }
  build(1, 1, n);
  for (int i = 1; i <= n; ++i) {
    if (!vis[i]) {
      dfs(i);
    }
  }
  for (int i = 1; i <= n; ++i) {
    ans[p[i]] = i;
  }
  for (int i = 1; i <= n; ++i) printf("%d ", ans[i]);
  return 0;
}
