#include <bits/stdc++.h>
using namespace std;
int ni() {
  int a;
  scanf("%d", &a);
  return a;
}
const int N = (int)5e5 + 3;
const int OO = 1e9;
int n;
int a[N];
int p[N];
int to[N];
int from[N];
vector<int> g[N];
bool used[N];
int cl[N];
vector<int> order;
pair<int, int> neutral = make_pair(-OO, -1);
void dfs(int v) {
  used[v] = 1;
  for (auto& u : g[v]) {
    if (!used[u]) {
      dfs(u);
    }
  }
  order.push_back(v);
}
bool cycle(int v) {
  cl[v] = 2;
  for (auto& u : g[v]) {
    if (cl[u] == 2) {
      cl[v] = 1;
      return true;
    } else if (cl[u] == 0) {
      if (cycle(u)) {
        cl[v] = 1;
        return true;
      }
    }
  }
  cl[v] = 1;
  return false;
}
struct SegTree {
  vector<pair<int, int> > t;
  int ds;
  SegTree() {}
  SegTree(int n) {
    for (ds = 1; ds < n; ds *= 2)
      ;
    t.assign(2 * ds + 1, neutral);
  }
  void Update(int x, pair<int, int> val) {
    x += ds;
    t[x] = val;
    for (x = x / 2; x >= 1; x /= 2) {
      t[x] = max(t[2 * x], t[2 * x + 1]);
    }
  }
  pair<int, int> Query(int l, int r) {
    l += ds;
    r += ds;
    pair<int, int> ret = neutral;
    for (; l <= r;) {
      if (l & 1) ret = max(ret, t[l]);
      if (!(r & 1)) ret = max(ret, t[r]);
      l = (l + 1) / 2;
      r = (r - 1) / 2;
    }
    return ret;
  }
};
SegTree tree;
void dfs2(int v) {
  tree.Update(v, neutral);
  used[v] = 1;
  if (!used[from[v]] && from[v] != n) {
    dfs2(from[v]);
  }
  for (;;) {
    auto q = tree.Query(0, to[v] - 1);
    if (q.first > v) {
      dfs2(q.second);
    } else {
      break;
    }
  }
  order.push_back(v);
}
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(0);
  cin >> n;
  fill(to, to + n, n);
  fill(from, from + n, n);
  fill(p, p + n, -1);
  for (int(i) = (0); (i) < (n); (i)++) {
    cin >> a[i];
    if (a[i] != -1) {
      to[i] = a[i] - 1;
      from[a[i] - 1] = i;
    }
  }
  tree = SegTree(n + 1);
  for (int(i) = (0); (i) < (n); (i)++) {
    tree.Update(i, make_pair(from[i], i));
  }
  bool cyc = false;
  for (int(i) = (0); (i) < (n); (i)++) {
    if (cl[i] == 0) {
      if (cycle(i)) {
        cyc = true;
        break;
      }
    }
  }
  cerr << "cyc"
       << " " << cyc << endl;
  ;
  for (int(i) = (0); (i) < (n); (i)++) {
    if (!used[i]) {
      dfs2(i);
    }
  }
  for (int(i) = (0); (i) < (n); (i)++) {
    p[order[i]] = i;
  }
  for (int(i) = (0); (i) < (n); (i)++) {
    cout << p[i] + 1 << " ";
  }
  return 0;
}
