/*
22 Martie 2025, Pahonie George-Alessio
Ordinea de rank a unui tablou
Se dau n elemente intr-un tablou.
Sa se inlocuiasca fiecare element cu
pozitia pe care s-ar afla daca tabloul
ar fi sortat crescator. Daca avem elemente
identice acestea vor primi aceiasi pozitie.
Exemplu : (indexare de la 1)
Pozitia : 1 2 3 4 5
tablou initial : {2,5,3,8,4}
tabloul sortat : {2,3,4,5,8}
de afisat : {1,4,2,5,3}
Explicatie : dupa ce vectorul este sortat -
2 se afla pe pozitia 1
5 se afla pe pozitia 4
3 se afla pe pozitia 2
8 se afla pe pozitia 5
4 se afla pe pozitia 3
Solutie in O(NlogN) cu functia sort.
*/
#include
#include
using namespace std;
int v[10005],p[10005], r[10005];
bool cmp(int a, int b)
{
return v[a] < v[b];
}
int main()
{
int n;
cin >> n;
for(int i = 1;i<=n;i++)
{
cin >> v[i];
p[i] = i;
}
sort(p+1,p+n+1,cmp);
/// Acum v[p[i]] este tabloul v sortat crescator.
// Adica p[i] = pozitia elementului i din v sortat crescator (exact ce avem nevoie)
/*
for(int i = 1;i<=n;i++)
cout << v[p[i]] << ' ';
cout << '\n';
*/
int cnt = 1;
r[p[1]] = cnt;
for(int i = 2;i<=n;i++)
{
// Daca in v sortat elementele nu sunt identice
// atunci avem un element nou.
if(v[p[i]] != v[p[i-1]])
cnt++;
r[p[i]] = cnt;
}
for(int i = 1;i<=n;i++)
cout << r[i] << ' ';
return 0;
}