#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <numeric>
#include <cstdint>
using namespace std;
// #define debug 1
// #if debug
// ifstream fin("input.txt");
// #else
// #define fin cin
// #endif
ifstream fin("schi.in");
ofstream fout("schi.out");
int n;
void build(int nod, vector<int> &arb, int st, int dr) {
if (st == dr)
arb[nod] = 1;
else {
int mid = (st + dr) / 2;
build(2 * nod, arb, st, mid);
build(2 * nod + 1, arb, mid + 1, dr);
arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}
}
void update(int nod, vector<int> &arb, int st, int dr, int poz, int val) {
if (st == dr)
arb[nod] = val;
else {
int mid = (st + dr) / 2;
if (poz <= mid)
update(2 * nod,arb,st,mid,poz,val);
else
update(2 * nod + 1,arb,mid + 1,dr,poz,val);
arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}
}
void query(int nod,vector<int>&arb, int st, int dr, int val,int &sol) {
if (st == dr)
sol = st;
else {
int mid = (st + dr) / 2;
if (val <= arb[2 * nod])
query(2 * nod,arb,st,mid,val,sol);
else
query(2 * nod + 1,arb,mid + 1,dr,val - arb[2 * nod],sol);
}
}
int main() {
fin >> n;
vector<int> arb(4 * n + 1, 0);
build(1, arb, 1, n);
vector<int>a(n + 1,0);
vector<int>sol(n + 1,0);
for (int i = 1;i <= n;i++)
fin>>a[i];
for (int i = n;i >= 1;i--) {
int aux = 0;
query(1,arb,1,n,a[i],aux);
update(1,arb,1,n,aux,0);
sol[aux] = i;
}
for (int i = 1;i <= n;i++)
fout<<sol[i]<<'\n';
}