Cod sursa(job #200569)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 24 iulie 2008 18:11:08
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <algorithm> 
#define IN "schi.in"
#define OUT "schi.out"
#define left (nod << 1)
#define right ((nod << 1) | 1) 
#define mij ( (u+p)>>1 ) 
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<15

int sol[N_MAX],A[N_MAX << 1],v[N_MAX];
int N;

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d\n", &N);
	FOR(i,1,N)
		scanf("%d", &v[i]);
}

int update(int nod,int u,int p)
{
	if(u>p)
		return 0;
	if(u==p)
		A[nod] = 1;
	else  
        A[nod] = update(left,u,mij) + update(right,mij+1,p);  
	return A[nod];  
}	

int query(int nod,int u,int p,int x)
{  
	--A[nod];  
	if(u == p)  
		return u;  
    if(A[left] >= x)  
		return query(left,u,mij,x);  
    else  
		return query(right,mij + 1,p,x - A[left]);  
}

void solve()
{
	update(1,1,N);
	for(int i=N;i;i--)  
    	sol[ query(1,1,N,v[i]) ] = i;
	FOR(i,1,N) 
        printf("%d\n",sol[i]);  
}

int main()
{
	scan();
	solve();
	return 0;
}