#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 3e5+10;
bool gtfo;
int v[NMAX], aint[NMAX], sum=0, n, ans[NMAX], locliber=0;
void build(int, int, int, int);
void update(int, int, int, int);
void caut_liber(int, int, int, int);
int main()
{
ifstream cin ("schii.in");
ofstream cout ("schii.out");
int n, loc=0;
cin >> n;
for (int i=1; i<=n; i++)
{
cin >> v[i];
build(1, 1, n, i);
}
for (int i=n; i>0; i--)
{
loc = v[i];
gtfo = false;
locliber = 0;
sum = 0;
caut_liber(1, 1, n, loc);
ans[locliber] = i;
update(1, 1, n, locliber);
/*
for (int j=1; j<=n; j++)
{
cout << ans[j] << " ";
}
cout << '\n';
for (int j=8; j<=15; j++)
{
cout << aint[j] << " ";
}
cout << '\n' << '\n';
*/
}
for (int i=1; i<=n; i++)
{
cout << ans[i] << '\n';
}
return 0;
}
void update(int nod, int st, int dr, int poz)
{
if (st == dr)
{
aint[nod] = 0;
return;
}
int mid = (st+dr)/2;
if (poz <= mid)
{
update(2*nod, st, mid, poz);
}
else if (poz > mid)
{
update(2*nod+1, mid+1, dr, poz);
}
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
void caut_liber(int nod, int st, int dr, int val)
{
if (gtfo) return;
if ((aint[nod] < val-sum) || ((aint[nod] <= val-sum) && (sum != 0)) || ((aint[nod] == val) && (val == 1)))
{
sum += aint[nod];
if ((sum == val) && (st == dr))
{
locliber = dr;
gtfo = true;
}
else if (sum == val)
{
sum -= aint[nod];
}
else return;
}
int mid = (st+dr)/2;
caut_liber(2*nod, st, mid, val);
if (gtfo) return;
caut_liber(2*nod+1, mid+1, dr, val);
return;
}
void build(int nod, int st, int dr, int poz)
{
if (st == dr)
{
aint[nod] = 1;
return;
}
int mid = (st+dr)/2;
if (poz <= mid)
{
build(2*nod, st, mid, poz);
}
else if (poz > mid)
{
build(2*nod+1, mid+1, dr, poz);
}
aint[nod] = aint[2*nod] + aint[2*nod+1];
}