Pagini recente » Cod sursa (job #477727) | Cod sursa (job #2962851) | Cod sursa (job #2748189) | Cod sursa (job #596237) | Cod sursa (job #484425)
Cod sursa(job #484425)
#include<stdio.h>
int AIB[50000];
int v[50505],l[50505],N;
int zeros(int x)
{
return ((x ^ (x - 1)) & x );
}
void Add(int x, int quantity)
{
int i;
for (i = x; i <= N; i += zeros(i))
AIB[i] += quantity;
}
void del(int x, int quantity)
{
int i;
for (i = x; i <= N; i += zeros(i))
AIB[i] -= quantity;
}
int comp(int x)
{
int i, ret = 0;
for (i = x; i > 0; i -= zeros(i))
ret += AIB[i];
return ret;
}
int st,dr,mij,rez;
int main()
{
freopen("schi.in","r",stdin);
freopen("schi.out","w",stdout);
scanf("%d",&N);
for(int i=1;i<=N;++i)
{
scanf("%d",&v[i]);
Add(i,1);
}
for(int i=N;i>=1;--i)
{
st=1;
dr=N;
rez=0;
while(st<=dr)
{
mij=(st+dr)/2;
//printf("%d!\n",comp(mij));
if(comp(mij)>v[i])
{
dr=mij-1;
}
else if(comp(mij)==v[i])
{
rez=mij;
dr=mij-1;
}
else
st=mij+1;
}
l[rez]=i;
del(rez,1);
}
for(int i=1;i<=N;++i)
printf("%d\n",l[i]);
}