Cod sursa(job #253043)

Utilizator AndreyPAndrei Poenaru AndreyP Data 5 februarie 2009 13:12:04
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include<stdio.h>
#define N 30010
int n,t[3*N];
int v[N];
int sol[N];
inline int left(int x)
{
	return x<<1;
}
inline int right(int x)
{
	return (x<<1)+1;
}
inline void citire()
{
	scanf("%d",&n);
	for(int i=1; i<=n; ++i)
		scanf("%d",&v[i]);
}
void init(int p,int u,int poz)
{
	if(p>u)
		return;
	if(p==u)
	{
		t[poz]=1;
		return;
	}
	int m=(p+u)>>1;
	init(p,m,left(poz));
	init(m+1,u,right(poz));
	t[poz]=t[left(poz)]+t[right(poz)];
}
int afla(int p,int u,int poz,int x)
{
	--t[poz];
	if(p==u)
		return p;
	if(t[left(poz)]>=x)
		return afla(p,(p+u)>>1,left(poz),x);
	else
		return afla(((p+u)>>1)+1,u,right(poz),x-t[left(poz)]);
}
int main()
{
	freopen("schi.in","r",stdin);
	freopen("schi.out","w",stdout);
	citire();
	init(1,n,1);
	for(int i=n; i; --i)
		sol[afla(1,n,1,v[i])]=i;
	for(int i=1; i<=n; ++i)
		printf("%d\n",sol[i]);
	return 0;
}