#include <bits/stdc++.h>
using namespace std;
long long int pw(long long int a, long long int b, long long int mod) {
  if (!b) return 1;
  if (b & 1) return a * pw(a * a % mod, b / 2, mod) % mod;
  return pw(a * a % mod, b / 2, mod) % mod;
}
const long long int N = 5e5 + 10;
const long long int M = 1.2e7 + 10;
const long long int MOD = 1e9 + 7;
const long long int INF = 1e18;
int n, A[N], seg[N << 2], timer;
bitset<M> mark;
vector<int> adj[M], topo;
inline void add_edge(int u, int v) { adj[u].push_back(v); }
void Build(int id, int l, int r) {
  if (r - l == 1) {
    seg[id] = l;
    return;
  }
  int mid = (l + r) >> 1;
  Build(id << 1, l, mid);
  Build(id << 1 | 1, mid, r);
  seg[id] = timer++;
  add_edge(seg[id << 1], seg[id]);
  add_edge(seg[id << 1 | 1], seg[id]);
}
void Update(int id, int l, int r, int ql, int qr, int u) {
  if (qr <= ql) return;
  if (qr <= l || r <= ql) return;
  if (ql <= l && r <= qr) {
    add_edge(seg[id], u);
    return;
  }
  int mid = (l + r) >> 1;
  Update(id << 1, l, mid, ql, qr, u);
  Update(id << 1 | 1, mid, r, ql, qr, u);
}
void Mark(int id, int l, int r, int ind) {
  if (ind < l || r <= ind) return;
  if (r - l == 1) {
    seg[id] = timer++;
    return;
  }
  int mid = (l + r) >> 1;
  if (ind < mid)
    Mark(id << 1, l, mid, ind);
  else
    Mark(id << 1 | 1, mid, r, ind);
  seg[id] = timer++;
  add_edge(seg[id << 1], seg[id]);
  add_edge(seg[id << 1 | 1], seg[id]);
}
void DFS(int u) {
  mark[u] = 1;
  for (int v : adj[u])
    if (!mark[v]) {
      DFS(v);
    }
  if (u < n) topo.push_back(u);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n;
  timer = n;
  Build(1, 0, n);
  for (int i = 0; i < n; i++) {
    cin >> A[i];
    A[i]--;
    if (A[i] >= 0) {
      add_edge(i, A[i]);
      if (A[i] < i) {
        Update(1, 0, n, 0, A[i], i);
      } else {
        Update(1, 0, n, 0, i, i);
        Update(1, 0, n, i + 1, A[i], i);
      }
      Mark(1, 0, n, A[i]);
    } else {
      Update(1, 0, n, 0, i, i);
      Update(1, 0, n, i + 1, n, i);
    }
  }
  for (int i = 0; i < timer; i++)
    if (!mark[i]) {
      DFS(i);
    }
  reverse(topo.begin(), topo.end());
  for (int i = 0; i < n; i++) {
    A[topo[i]] = i + 1;
  }
  for (int i = 0; i < n; i++) {
    cout << A[i] << ' ';
  }
  cout << '\n';
  return 0;
}
