Cod sursa(job #580876)

Utilizator avram_florinavram florin constantin avram_florin Data 13 aprilie 2011 16:41:02
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#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;
}