#include <bits/stdc++.h>
using namespace std;
#define MAX_N 30005
int v[MAX_N], t[4 * MAX_N], ans[MAX_N];
void build( int node, int le, int ri ){
if( le == ri ){
t[node] = 1;
return;
}
int mid = ( le + ri ) / 2;
build( 2 * node, le, mid );
build( 2 * node + 1, mid + 1, ri );
t[node] = t[2 * node] + t[2 * node + 1];
}
void update( int node, int le, int ri, int pos ){
if( le == ri ){
t[node] = 0;
return;
}
int mid = ( le + ri ) / 2;
if( pos <= mid )
update( 2 * node, le, mid, pos );
else
update( 2 * node + 1, mid + 1, ri, pos );
t[node] = t[2 * node + 1] + t[2 * node];
}
//vrem sa calculam cea mai mica pozitie astfel incat in intervalul [1, pos] sa avem un nr x de 1
int query( int node, int le, int ri, int x, int cnt ){
if( le == ri ){
return le;
}
int mid = ( le + ri ) / 2;
if( t[2 * node] >= x - cnt )
return query( 2 * node, le, mid, x, cnt );
return query( 2 * node + 1, mid + 1, ri, x, cnt + t[2 * node] );
}
int main(){
ifstream cin( "schi.in" );
ofstream cout( "schi.out" );
int n, i, pos;
cin >> n;
for( i = 1; i <= n; i++ )
cin >> v[i];
build( 1, 1, n );
for( i = n; i > 0; i-- ){
pos = query( 1, 1, n, v[i], 0 );
ans[pos] = i;
update( 1, 1, n, pos );
}
for( i = 1; i <= n; i++ )
cout << ans[i] << "\n";
return 0;
}