Pagini recente » Cod sursa (job #2060290) | Cod sursa (job #282310) | Cod sursa (job #408584) | Cod sursa (job #2295273) | Cod sursa (job #2312817)
#include<stdio.h>
int v[30001], aux[60005], arbore[30005], n;
void construire_arbore(int st, int dr, int pozitie)
{
if(st == dr)
aux[pozitie] = 1;
else {
int mijloc = (st + dr) / 2;
construire_arbore(st, mijloc, 2 * pozitie);
construire_arbore(mijloc + 1, dr, 2 * pozitie + 1);
aux[pozitie] = aux[pozitie * 2] + aux[pozitie * 2 + 1];
}
}
void restabilire_arbore(int st, int dr, int pozitie, int pozitie_curenta, int nod)
{
if(st == dr)
{
arbore[st] = pozitie_curenta;
aux[pozitie] = 0;
}
else{
int mijloc = (st + dr) / 2;
if(nod <= aux[2 * pozitie])
restabilire_arbore(st, mijloc, 2 * pozitie, pozitie_curenta, nod);
else restabilire_arbore(mijloc + 1, dr, 2 * pozitie + 1, pozitie_curenta, nod - aux[2 * pozitie]);
aux[pozitie] = aux[pozitie * 2] + aux[pozitie * 2 + 1];
}
}
void citire()
{
FILE *f = fopen("schi.in", "r+");
fscanf(f, "%d", &n);
for(int i = 1; i<= n; i++)
fscanf(f, "%d", &v[i]);
construire_arbore(1, n, 1);
}
void rezolvare()
{
FILE *g = fopen("schi.out", "w+");
for(int i = n ; i > 0; i--)
restabilire_arbore(1, n ,1, i, v[i]);
for(int i = 1; i <= n; i++)
fprintf(g, "%d\n", arbore[i]);
}
int main()
{
citire();
rezolvare();
return 0;
}