#include <bits/stdc++.h>
#define MAXN 30000
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
int v[MAXN + 1], aint[4 * MAXN], loc[MAXN + 1];
int trans(int n){
int rez;
rez = 1;
while(rez < n){
rez *= 2;
}
return rez;
}
void build(int nod, int st, int dr){
int mij;
if(st == dr){
aint[nod] = 1;
}else{
mij = (st + dr) / 2;
build(2 * nod, st, mij);
build(2 * nod + 1, mij + 1, dr);
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
}
void update(int nod, int st, int dr, int poz, int val){
int mij;
if(st == dr){
aint[nod] = val;
}else{
int mij;
mij = (st + dr) / 2;
if(poz <= mij){
update(2 * nod, st, mij, poz, val);
}else{
update(2 * nod + 1, mij + 1, dr, poz, val);
}
aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
}
}
int query(int nod, int st, int dr, int val){
int mij;
// printf("st = %d, dr = %d, a = %d, l = %d, r = %d, val = %d\n", st, dr, aint[nod], aint[2 * nod], aint[2 * nod + 1], val);
if(st == dr){
return st;
}
mij = (st + dr) / 2;
if(aint[2 * nod] >= val){
return query(2 * nod, st, mij, val);
}
val -= aint[2 * nod];
return query(2 * nod + 1, mij + 1, dr, val);
}
int main()
{
int n, n2, i, st, dr, mij, q;
fin >> n;
n2 = trans(n);
for(i = 1; i <= n; i++){
fin >> v[i];
}
build(1, 1, n2);
// printf("q = %d\n", query(1, 1, n, 1, 2));
for(i = n; i >= 1; i--){
// st = 0;
// dr = n;//(st,dr]
// while(dr - st > 1){
// mij = (st + dr) / 2;
// printf("st = %d, dr = %d, mij = %d, i = %d, a = %d\n", st, dr, mij, n2 + mij - 1);
// if(aint[n2 + mij - 1] >= v[i]){
//// printf("1");
// dr = mij;
// }else{
//// printf("2");
// st = mij;
// }
//// printf("st = %d, dr = %d, mij = %d\n", st, dr, mij);
// }
q = query(1, 1, n, v[i]);
// printf("aint = %d, i = %d, q = %d, cat = %d\n", aint[1], i, q, v[i]);
loc[q] = i;
update(1, 1, n2, q, 0);
}
for(i = 1; i <= n; i++){
fout << loc[i] << "\n";
}
return 0;
}