#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
// rezolvare folosind arbori de intervale
using namespace std;
int N;
short v[30010],arb[65536],sol[30010]; // arb[i]=numarul de pozitii libere ramase in intervalul corespunzator nodului i
void update(int,int,int,int);
void operation(int,int,int,int,int);
int main()
{
FILE *f,*g;
f=fopen("schi.in","r");
g=fopen("schi.out","w");
fscanf(f,"%i",&N);
FOR (i,1,N) {
fscanf(f,"%i",&v[i]);
update(1,1,N,i);
}
ROF (i,N,1) {
operation(1,1,N,v[i],i);
}
FOR (i,1,N) {
fprintf(g,"%i\n",sol[i]);
}
fclose(f);fclose(g);
return 0;
}
void update(int nod,int st,int dr,int poz) { // se adauga sau elimina o pozitie
if (st==dr) {
arb[nod]=1;
}
else {
int mij=(st+dr)>>1;
if (poz<=mij) {
update((nod<<1),st,mij,poz);
}
else {
update((nod<<1)+1,mij+1,dr,poz);
}
arb[nod]=arb[(nod<<1)]+arb[(nod<<1)+1];
}
}
void operation(int nod,int st,int dr,int poz,int participant) { // se cauta a poz-a pozitie care nu e eliminata
if (st==dr) {
arb[nod]=0;
sol[st]=participant;
}
else {
int mij=(st+dr)>>1;
if (arb[(nod<<1)]>=poz) {
operation((nod<<1),st,mij,poz,participant);
}
else {
poz-=arb[(nod<<1)];
operation((nod<<1)+1,mij+1,dr,poz,participant);
}
arb[nod]=arb[(nod<<1)]+arb[(nod<<1)+1];
}
}