#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 a, int b){
int mij;
if(a <= st && dr <= b){
return aint[nod];
}
if(b < st || a > dr){
return 0;
}
mij = (st + dr) / 2;
if(b <= mij){
return query(2 * nod, st, mij, a, b);
}
if(a >= mij + 1){
return query(2 * nod + 1, mij + 1, dr, a, b);
}
return query(2 * nod, st, mij, a, b) + query(2 * nod + 1, mij + 1, dr, a, b);
}
int main()
{
int n, n2, i, st, dr, mij;
fin >> n;
n2 = trans(n);
for(i = 1; i <= n; i++){
fin >> v[i];
}
build(1, 1, n);
// 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\n", st, dr, mij);
if(query(1, 1, n, 1, mij) >= v[i]){
// printf("1");
dr = mij;
}else{
// printf("2");
st = mij;
}
// printf("st = %d, dr = %d, mij = %d\n", st, dr, mij);
}
// printf("i = %d, dr = %d, cat = %d\n", i, dr, query(1, 1, n, 1, dr));
loc[dr] = i;
update(1, 1, n, dr, 0);
}
for(i = 1; i <= n; i++){
fout << loc[i] << "\n";
}
return 0;
}