Pagini recente » Cod sursa (job #2173464) | Monitorul de evaluare | Cod sursa (job #658835) | Istoria paginii monthly-2014/runda-1/solutii | Cod sursa (job #580876)
Cod sursa(job #580876)
#include<cstdio>
using namespace std;
const int MaxN = 30001;
const char InFile[] = "schi.in";
const char OutFile[] = "schi.out";
int n,poz,v[MaxN],sol[MaxN],Arb[4*MaxN];
void build( int nod , int left , int right )
{
if( left == right )
{
Arb[nod] = 1;
return ;
}
int midd = (left+right) >> 1;
build(2*nod,left,midd);
build(2*nod+1,midd+1,right);
Arb[nod] = Arb[2*nod]+Arb[2*nod+1];
}
void update_and_query( int nod , int left , int right , int val )
{
if( left == right )
{
poz = left;
Arb[nod] = 0;
return ;
}
int midd = (left+right) >> 1;
if( Arb[2*nod] >= val )
update_and_query(2*nod,left,midd,val);
else
update_and_query(2*nod+1,midd+1,right,val-Arb[2*nod]);
Arb[nod] = Arb[2*nod]+Arb[2*nod+1];
}
int main()
{
freopen( InFile , "r" , stdin );
freopen( OutFile , "w" , stdout );
scanf("%d" , &n );
int i;
for( i = 1 ; i <= n ; i++ )
scanf("%d" , v+i );
build(1,1,n);
for( i = n ; i ; i-- )
{
poz = 0;
update_and_query(1,1,n,v[i]);
sol[poz] = i;
}
for( i = 1 ; i <= n ; i++ )
printf("%d\n" , sol[i]);
return 0;
}