#include <bits/stdc++.h>
const int maxn = 500005;
int a[maxn], b[maxn];
std::pair<int, int> t[maxn << 2];
void build(int u, int v, int node) {
  if (u == v)
    t[node] = {b[u], u};
  else {
    int m = (u + v) >> 1;
    build(u, m, node << 1);
    build(m + 1, v, node << 1 | 1);
    t[node] = std::max(t[node << 1], t[node << 1 | 1]);
  }
}
void del(int p, int u, int v, int node) {
  if (u == v)
    t[node] = {0, p};
  else {
    int m = (u + v) >> 1;
    if (p <= m)
      del(p, u, m, node << 1);
    else
      del(p, m + 1, v, node << 1 | 1);
    t[node] = std::max(t[node << 1], t[node << 1 | 1]);
  }
}
std::pair<int, int> query(int l, int r, int u, int v, int node) {
  if (l > r) return {0, 0};
  if (l <= u && v <= r) return t[node];
  std::pair<int, int> ans = {0, 0};
  int m = (u + v) >> 1;
  if (l <= m) ans = std::max(ans, query(l, r, u, m, node << 1));
  if (m + 1 <= r) ans = std::max(ans, query(l, r, m + 1, v, node << 1 | 1));
  return ans;
}
int n;
void read() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) b[i] = n + 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    if (a[i] != -1)
      b[a[i]] = i;
    else
      a[i] = n + 1;
  }
}
bool vis[maxn];
std::vector<int> topological_order;
void dfs(int idx) {
  vis[idx] = true;
  del(idx, 1, n, 1);
  if (b[idx] != n + 1 && !vis[b[idx]]) dfs(b[idx]);
  while (1) {
    auto tmp = query(1, a[idx] - 1, 1, n, 1);
    if (tmp.first > idx && !vis[tmp.second])
      dfs(tmp.second);
    else
      break;
  }
  topological_order.push_back(idx);
}
int ans[maxn];
void solve() {
  build(1, n, 1);
  for (int i = 1; i <= n; i++)
    if (!vis[i]) dfs(i);
  for (int i = 0; i < n; i++) ans[topological_order[i]] = i + 1;
  for (int i = 1; i <= n; i++) printf("%d%c", ans[i], " \n"[i == n]);
}
int main() {
  read();
  solve();
}
