Pagini recente » Cod sursa (job #2409803) | Cod sursa (job #1980570) | Cod sursa (job #1129855) | Cod sursa (job #1485987) | Cod sursa (job #2986062)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
int nrSchiori, pozitie[30005], fenwickTree[30005], schiori[30005];
int getLSB(int x)
{
return (x & (-x));
}
void update(int poz, int val)
{
for (; poz <= nrSchiori; poz += getLSB(poz))
fenwickTree[poz] += val;
}
int query(int poz)
{
int sum = 0;
for (; poz > 0; poz -= getLSB(poz))
sum += fenwickTree[poz];
return sum;
}
// Gasim al x-lea loc liber in clasament si il marcam ca ocupat
int rezolvare(int x)
{
int pozitieInFenwick = 0;
for (int i = log2(nrSchiori); i >= 0; i--)
{
int pozitiePosibila = pozitieInFenwick + (1 << i);
if (pozitiePosibila <= nrSchiori && fenwickTree[pozitiePosibila] < x)
{
pozitieInFenwick = pozitiePosibila;
x -= fenwickTree[pozitieInFenwick];
}
}
pozitieInFenwick++;
// Marcam pozitia din Fenwick ca fiind ocupata, asa ca anulam existenta locului disponibil
update(pozitieInFenwick, -1);
return pozitieInFenwick;
}
int main()
{
fin >> nrSchiori;
// Cream pozitiile in clasament pentru schiori
for (int i = 1; i <= nrSchiori; i++)
update(i, 1);
for (int i = 1; i <= nrSchiori; i++)
fin >> schiori[i];
for (int i = nrSchiori; i > 0; i--)
pozitie[rezolvare(schiori[i])] = i;
for (int i = 1; i <= nrSchiori; i++)
fout << pozitie[i] << "\n";
return 0;
}