Pagini recente » Cod sursa (job #1209388) | Cod sursa (job #943723) | Cod sursa (job #660847) | Rezultatele filtrării | Cod sursa (job #2002410)
#include<cstdio>
using namespace std;
const int nmax=30005;
int ranking[nmax],add,v[nmax],arb[4*nmax+5],poz,val,sol;
inline void update(int node,int st,int dr)
{
if(st==dr)
{
arb[node]++;
return;
}
int med=((dr-st)>>1)+st;
if(poz>med)
update(node<<1|1,med+1,dr);
else
update(node<<1,st,med);
arb[node]=arb[node<<1]+arb[node<<1|1];
}
inline void query(int node,int st,int dr)
{
if(st==dr)
{
arb[node]--;
sol=st;
return;
}
int med=((dr-st)>>1) + st;
if(val<=arb[node<<1])
query(node<<1,st,med);
else
{
val-=arb[node<<1];
query(node<<1|1,med+1,dr);
}
arb[node]=arb[node<<1]+arb[node<<1|1];
}
int main()
{
freopen("schi.in","r",stdin);
freopen("schi.out","w",stdout);
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&v[i]);
poz=i;
update(1,1,n);
}
for(i=n;i;--i)
{
sol=-1;
val=v[i];
query(1,1,n);
ranking[sol]=i;
}
for(i=1;i<=n;++i)
printf("%d\n",ranking[i]);
}