Pagini recente » Cod sursa (job #778547) | Cod sursa (job #1472314) | Cod sursa (job #1183487) | Monitorul de evaluare | Cod sursa (job #1508085)
#include <fstream>
using namespace std;
ifstream fin ("schi.in");
ofstream fout ("schi.out");
short n, stanga, dreapta, sum, Data[30010], Sol[30010], ARBI[100010];
void Update(short nod, short left, short right, short poz, short value)
{
if (left == right)
{
ARBI[nod] += value;
}
else
{
short mid = (left + right) >> 1;
if (poz <= mid)
{
Update((nod << 1), left, mid, poz, value);
}
else
{
Update((nod << 1) + 1, mid + 1, right, poz, value);
}
ARBI[nod] = ARBI[(nod << 1)] + ARBI[(nod << 1) + 1];
}
}
void Query(short nod, short left, short right)
{
if (stanga <= left && right <= dreapta)
{
sum += ARBI[nod];
return;
}
short mid = (left + right) >> 1;
if (stanga <= mid)
{
Query((nod << 1), left, mid);
}
if (dreapta > mid)
{
Query((nod << 1) + 1, mid + 1, right);
}
}
short Binary_Search(short value)
{
short i = n, step = 1;
while (step <= n) step <<= 1;
step >>= 1;
while (step)
{
if (i - step > 0)
{
sum = 0;
stanga = 1;
dreapta = i - step;
Query(1, 1, n);
if (sum >= value)
{
i -= step;
}
}
step >>= 1;
}
return i;
}
int main()
{
fin >> n;
for (short i = 1; i <= n; i++)
{
fin >> Data[i];
Update(1, 1, n, i, 1);
}
for (short i = n ; i >= 1; i--)
{
short poz = Binary_Search(Data[i]);
Sol[poz] = i;
Update(1, 1, n, poz, -1);
}
for (short i = 1; i <= n; i++) fout << Sol[i] << '\n';
fout.close();
return 0;
}