//
// main.cpp
// Schi
//
// Created by Albastroiu Radu on 9/21/16.
// Copyright © 2016 Albastroiu Radu. All rights reserved.
//
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>
#define MULTFOARTEMULT (1<<28)-1
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
int i, j, n, m, tip, a, b, v[30001], rez[30001], arb[60001], Max, k, pos;
void populateArb(int left, int right, int p)
{
if(left == right)
{
arb[p] = 1;
}
else
{
int mij = (left+right)/2;
populateArb(left, mij, p*2);
populateArb(mij+1, right, p*2+1);
arb[p] = arb[p*2] + arb[p*2+1];
}
}
void update(int left, int right, int a, int b, int p)
{
if(left == right)
{
arb[p] = b;
}
else
{
int mij = (left+right)/2;
if( a <= mij && a >= left )
update(left, mij, a, b, p*2);
if( a > mij && a <= right )
update(mij+1, right, a, b, p*2+1);
arb[p] = arb[p*2] + arb[p*2+1];
}
}
void querry(int left, int right, int p)
{
if(left==right)
{
pos = left;
}
else
{
int mij = (left+right)/2;
if( v[i] <= arb[p*2] )
{
querry(left, mij, p*2 );
}
else
{
v[i] -= arb[p*2];
querry(mij+1, right, p*2+1);
}
}
}
int main()
{
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
k=1;
populateArb(1, n, 1);
for(i=n;i>0;i--)
{
querry(1,n,1);
update(1,n,pos,0,1);
rez[pos] = i;
}
for(i=1;i<=n;i++)
fout<<rez[i]<<"\n";
return 0;
}