Pagini recente » Borderou de evaluare (job #1265840) | Borderou de evaluare (job #201633) | Cod sursa (job #2345215) | Cod sursa (job #2303410) | Cod sursa (job #3144998)
#include <bits/stdc++.h>
using namespace std;
ifstream in("schi.in");
ofstream out("schi.out");
int v[30001], afis[30001];
int aib[30001], n;
int lsb(int x)
{
return x & -x;
}
void update(int poz, int val)
{
for(; poz <= n; poz += lsb(poz))
aib[poz] += val;
}
int query(int poz)
{
int sum = 0;
for(; poz > 0; poz -= lsb(poz))
sum += aib[poz];
return sum;
}
int al_catelea_zero(int k)
{
int st = 0, dr = n;
while(st < dr - 1)
{
int mij = (st + dr) / 2;
if(query(mij) >= k)
dr = mij - 1;
else
st = mij;
}
if(query(dr) < k)
return dr + 1;
return st + 1;
}
int main()
{
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
for(int i = 1; i <= n; i++)
aib[i] = lsb(i);
for(int i = n; i >= 1; i--)
{
int x = al_catelea_zero(v[i]);
//out << x << '\n';
afis[x] = i;
update(x, -1);
}
for(int i = 1; i <= n; i++)
out << afis[i] << '\n';
return 0;
}