#include <iostream>
#include <vector>
using namespace std;

struct Wezel { //B-drzewo
	bool lisc;
	int s = 0;
	int l_wart = 0;
	int wart[3];
	Wezel* nast[4] = {};
	void aktualizuj() {
		s = l_wart;
		if(!lisc) {
			for(int i=0; i<=l_wart; i++) {
				s += nast[i]->s;
			}
		}
	}
	void wstaw(int w, Wezel *cp, int poz) {
		for(int i=l_wart; i>poz; i--) {
			nast[i+1] = nast[i];
			wart[i] = wart[i-1];
		}
		wart[poz] = w;
		nast[poz+1] = cp;
		l_wart++;
	}
};

Wezel* podzial(Wezel* p, Wezel* &cl, int &poz) {
	int w = cl->wart[1];
	Wezel *cp = new Wezel;
	cp->lisc = cl->lisc;
	cp->wart[0] = cl->wart[2];
	cp->nast[0] = cl->nast[2];
	cp->nast[1] = cl->nast[3];
	cl->l_wart = cp->l_wart = 1;
	cl->aktualizuj();
	cp->aktualizuj();
	if(p==nullptr) {
		p = new Wezel;
		p->lisc = false;
		p->wart[0] = w;
		p->nast[0] = cl;
		p->nast[1] = cp;
		p->l_wart = 1;
		p->aktualizuj();
		cl = p;
		return p;
	}
	int g=0;
	while(p->nast[g]!=cl) {
		g++;
	}
	p->wstaw(w, cp, g);
	if(cl->s < poz) {
		poz = poz - cl->s - 1;
		return cp;
	}
	return cl;
}

void dodaj(Wezel* p, Wezel* &c, int wartosc, int poz) {
	Wezel *cur = c;
	if(c->l_wart==3) {
		cur = podzial(p, c, poz);
	}
	cur->s += 1;
	if(cur->lisc) {
		cur->wstaw(wartosc, nullptr, poz);
		return;
	}
	for(int i=0; i<=c->l_wart; i++) {
		int sn = cur->nast[i]->s;
		if(sn>=poz) {
			dodaj(cur, cur->nast[i], wartosc, poz);
			return;
		}
		poz -= sn+1;
	}
}

void elementy(Wezel *p, vector<int> &wart) {
	if(p->lisc) {
		for(int i=0; i<p->l_wart; i++) {
			wart.push_back(p->wart[i]);
		}
		return;
	}
	for(int i=0; i<p->l_wart; i++) {
		elementy(p->nast[i], wart);
		wart.push_back(p->wart[i]);
	}
	elementy(p->nast[p->l_wart], wart);
}

void solve() {
	int nn;
	cin >> nn;
	vector<int> dane(nn);
	for(int i=0; i<nn; i++) {
		cin >> dane[i];
		if(dane[i] > i) {
			cout << "NIE\n";
			return;
		}
	}
	Wezel* root = new Wezel;
	root->lisc = true;
	for(int i=0; i<nn; i++) {
		dodaj(nullptr, root, i, i-dane[i]);
	}
	vector<int> odp(nn);
	vector<int> wart;
	elementy(root, wart);
	for(int i=0; i<nn; i++) {
		odp[wart[i]] = i;
	}
	for(int i=0; i<nn; i++) {
		cout << odp[i]+1 << " ";
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	solve();
}
