#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> A; //here we have our input array
int n; //number of elements
//read input
scanf("%d",&n);
A.resize(n);
for(int i=0; i<n; i++) scanf("%d",&A[i]);
//create second array with positions
vector<pair<int,int> > B;
for(int i=0; i<n; i++) B.push_back(make_pair(A[i],i));
sort(B.begin(),B.end());
map<int,int> M; //here is mapping from numbers 1 to n to real numbers in A
//let's replace array A with new smaller elements
for(int i=0; i<n; i++) {
if(M.find(B[i].first)==M.end()) M[B[i].first]=M.size();
A[B[i].second]=M[B[i].first];
}
//now in array A we have elements between 1 to n
//and in map M we hold original number for every new number
//result array
for(int i=0; i<n; i++) printf("%d ",A[i]); printf("\n");
//result mapping
for(map<int,int>::iterator it=M.begin(); it!=M.end(); it++)
printf("%d: %d\n",(*it).second,(*it).first);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8aW50PiBBOyAvL2hlcmUgd2UgaGF2ZSBvdXIgaW5wdXQgYXJyYXkKCWludCBuOyAvL251bWJlciBvZiBlbGVtZW50cwoJLy9yZWFkIGlucHV0CglzY2FuZigiJWQiLCZuKTsKCUEucmVzaXplKG4pOwoJZm9yKGludCBpPTA7IGk8bjsgaSsrKSBzY2FuZigiJWQiLCZBW2ldKTsKCQoJLy9jcmVhdGUgc2Vjb25kIGFycmF5IHdpdGggcG9zaXRpb25zCgl2ZWN0b3I8cGFpcjxpbnQsaW50PiA+IEI7Cglmb3IoaW50IGk9MDsgaTxuOyBpKyspIEIucHVzaF9iYWNrKG1ha2VfcGFpcihBW2ldLGkpKTsKCXNvcnQoQi5iZWdpbigpLEIuZW5kKCkpOwoJbWFwPGludCxpbnQ+IE07IC8vaGVyZSBpcyBtYXBwaW5nIGZyb20gbnVtYmVycyAxIHRvIG4gdG8gcmVhbCBudW1iZXJzIGluIEEKCS8vbGV0J3MgcmVwbGFjZSBhcnJheSBBIHdpdGggbmV3IHNtYWxsZXIgZWxlbWVudHMKCWZvcihpbnQgaT0wOyBpPG47IGkrKykgewoJCWlmKE0uZmluZChCW2ldLmZpcnN0KT09TS5lbmQoKSkgTVtCW2ldLmZpcnN0XT1NLnNpemUoKTsKCQlBW0JbaV0uc2Vjb25kXT1NW0JbaV0uZmlyc3RdOwoJfQoJCgkvL25vdyBpbiBhcnJheSBBIHdlIGhhdmUgZWxlbWVudHMgYmV0d2VlbiAxIHRvIG4KCS8vYW5kIGluIG1hcCBNIHdlIGhvbGQgb3JpZ2luYWwgbnVtYmVyIGZvciBldmVyeSBuZXcgbnVtYmVyCgkKCS8vcmVzdWx0IGFycmF5Cglmb3IoaW50IGk9MDsgaTxuOyBpKyspIHByaW50ZigiJWQgIixBW2ldKTsgcHJpbnRmKCJcbiIpOwoJLy9yZXN1bHQgbWFwcGluZwoJZm9yKG1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgaXQ9TS5iZWdpbigpOyBpdCE9TS5lbmQoKTsgaXQrKykKCQlwcmludGYoIiVkOiAlZFxuIiwoKml0KS5zZWNvbmQsKCppdCkuZmlyc3QpOwoJcmV0dXJuIDA7Cn0=