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

struct Wezel;
Wezel* Null;
struct Wezel {
	int s = 0, h = 0;
	int wart;
	Wezel* nast[2] = {Null, Null};
	void aktualizuj() {
		s = 1 + nast[0]->s + nast[1]->s;
		h = 1 + max(nast[0]->h, nast[1]->h);
	}
	int balans(int k) {
		return nast[k]->h - nast[1-k]->h;
	}
};

void dodaj(Wezel* &A, int wartosc, int poz) {
	if(A==Null) {
		A = new Wezel;
		A->s = A->h = 1;
		A->wart = wartosc;
		return;
	}
	int s0 = A->nast[0]->s;
	int k;
	if(s0>=poz) {
		k = 0;
	} else {
		k = 1;
		poz -= s0+1;
	}
	dodaj(A->nast[k], wartosc, poz);
	if(A->balans(k)<=1) {
		A->aktualizuj();
		return;
	}
	// naprawa wyważenia
	Wezel* B = A->nast[k];
	if(B->balans(1-k)>=1) {
		Wezel* C = B->nast[1-k];
		B->nast[1-k] = C->nast[k];
		A->nast[k] = C->nast[1-k];
		C->nast[k] = B;
		C->nast[1-k] = A;
		A->aktualizuj();
		B->aktualizuj();
		C->aktualizuj();
		A = C;
	} else {
		A->nast[k] = B->nast[1-k];
		B->nast[1-k] = A;
		A->aktualizuj();
		B->aktualizuj();
		A = B;
	}
}

void elementy(Wezel *p, vector<int> &wart) {
	if(p==Null) {
		return;
	}
	elementy(p->nast[0], wart);
	wart.push_back(p->wart);
	elementy(p->nast[1], 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 = Null;
	for(int i=0; i<nn; i++) {
		dodaj(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() {
	Null = new Wezel;
	Null->nast[0] = Null;
	Null->nast[1] = Null;
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	solve();
}
