Pagini recente » Cod sursa (job #293200) | Cod sursa (job #1622619) | Cod sursa (job #2846508) | Cod sursa (job #169911) | Cod sursa (job #2677994)
#include <iostream>
#include <fstream>
#define ub(x) x&(-x)
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
int aib[30001],n,x[30001],loc[30001];
void adun(int poz, int x) // actualizeaza toate aib urile care contin poz
{
for(int i=poz;i<=n;i+=ub(i))
{
aib[i]+=x;
}
}
int sum(int x) // returneaza suma [1..x]
{
int s=0;
for(int i=x;i>=1;i-=ub(i))
{
s+=aib[i];
}
return s;
}
int caut(int val) // caut x minim pentru care suma [1..x] = val
{
int ls=1,ld=n,m,s;
while(ls<=ld)
{
m = (ls+ld)/2;
s=sum(m);
if(val<=s)ld=m-1;
else ls=m+1;
}
return ls;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
adun(i,1);
fin>>x[i];
}
for(int i=n;i>=1;i--)
{
int poz = caut(x[i]);
adun(poz,-1);
loc[poz]=i;
}
for(int i=1;i<=n;i++)
{
fout<<loc[i]<<'\n';
}
}