#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("schi.in");
ofstream fout ("schi.out");
int n;
vector < int > Data(30010), Sol(30010), ARBI(30010 * 3);
void Update(int nod, int left, int right, int poz, int value)
{
if (left == right)
{
ARBI[nod] += value;
}
else
{
int mid = (left + right) >> 1;
if (poz <= mid)
{
Update((nod << 1), left, mid, poz, value);
}
else
{
Update((nod << 1) + 1, mid + 1, right, poz, value);
}
ARBI[nod] = ARBI[(nod << 1)] + ARBI[(nod << 1) + 1];
}
}
void Query(int nod, int left, int right, int stanga, int dreapta, int &sum)
{
if (stanga <= left && right <= dreapta)
{
sum += ARBI[nod];
return;
}
int mid = (left + right) >> 1;
if (stanga <= mid)
{
Query((nod << 1), left, mid, stanga, dreapta, sum);
}
if (dreapta > mid)
{
Query((nod << 1) + 1, mid + 1, right, stanga, dreapta, sum);
}
}
int Binary_Search(int value)
{
int i = n, step = 1;
while (step <= n) step <<= 1;
step >>= 1;
while (step)
{
if (i - step > 0)
{
int sum = 0;
Query(1, 1, n, 1, i - step, sum);
if (sum >= value)
{
i -= step;
}
}
step >>= 1;
}
return i;
}
int main()
{
fin >> n;
for (int i = 0; i < n; i++)
{
fin >> Data[i];
Update(1, 1, n, i + 1, 1);
}
for (int i = n - 1; i >= 0; i--)
{
int poz = Binary_Search(Data[i]);
Sol[poz] = i + 1;
Update(1, 1, n, poz, -1);
}
for (int i = 1; i <= n; i++) fout << Sol[i] << '\n';
fout.close();
return 0;
}