#include <bits/stdc++.h>
using namespace std;
int inf = -1e9;
struct node {
  int low;
  int high;
  pair<int, int> val;
  node() : val(make_pair(inf, 0)) {}
  node(int _l, int _h) : low(_l), high(_h), val(make_pair(inf, 0)) {}
  node(int _l, int _h, pair<int, int> _v) : low(_l), high(_h), val(_v) {}
};
int N = 1 << 19;
vector<node> seg(2 * N);
void initSeg(vector<pair<int, int>> vals) {
  int len = vals.size();
  for (int i = 0; i < len; ++i) {
    seg[N + i].val = vals[i];
    seg[N + i].low = i;
    seg[N + i].high = i + 1;
  }
  for (int i = len; i < N; ++i) {
    seg[N + i].low = i;
    seg[N + i].high = i + 1;
  }
  for (int i = N - 1; i > 0; --i) {
    seg[i].val = max(seg[2 * i].val, seg[2 * i + 1].val);
    seg[i].low = seg[2 * i].low;
    seg[i].high = seg[2 * i + 1].high;
  }
}
pair<int, int> querySeg(int index, int low, int high) {
  if (low <= seg[index].low && seg[index].high <= high) return seg[index].val;
  if (seg[index].high <= low || high <= seg[index].low)
    return make_pair(inf, 0);
  return max(querySeg(2 * index, low, high),
             querySeg(2 * index + 1, low, high));
}
pair<int, int> updateSeg(int index, int low, int high, pair<int, int> val) {
  if (low <= seg[index].low && seg[index].high <= high) {
    seg[index].val = val;
    return val;
  }
  if (seg[index].high <= low || high <= seg[index].low) return seg[index].val;
  pair<int, int> left = updateSeg(2 * index, low, high, val);
  pair<int, int> right = updateSeg(2 * index + 1, low, high, val);
  seg[index].val = max(left, right);
  return seg[index].val;
}
vector<int> seq;
vector<int> a;
vector<pair<int, int>> b;
vector<bool> toVisit;
int n;
void dfs(int index) {
  toVisit[index] = false;
  updateSeg(1, index, index + 1, make_pair(inf, 0));
  if (b[index].first < n && toVisit[b[index].first]) dfs(b[index].first);
  while (true) {
    pair<int, int> p = querySeg(1, 0, a[index]);
    if (p.first > index)
      dfs(p.second);
    else
      break;
  }
  seq.push_back(index);
}
int main() {
  int Test = 1;
  for (int test = 1; test <= Test; ++test) {
    cin >> n;
    a.clear();
    b.clear();
    seq.clear();
    toVisit.clear();
    for (int i = 0; i < n; ++i) {
      int in;
      cin >> in;
      if (in == -1) in = n + 1;
      a.push_back(in - 1);
    }
    for (int i = 0; i < n; ++i) {
      b.push_back(make_pair(n, i));
      toVisit.push_back(true);
    }
    for (int i = 0; i < n; ++i) {
      if (a[i] == n) continue;
      b[a[i]].first = i;
    }
    initSeg(b);
    for (int i = 0; i < n; ++i) {
      if (toVisit[i]) dfs(i);
    }
    int ans[n];
    for (int i = 0; i < n; ++i) {
      ans[seq[i]] = i + 1;
    }
    for (int i = 0; i < n; ++i) {
      cout << ans[i] << ' ';
    }
    cout << endl;
  }
  return 0;
}
