Cod sursa(job #682369)

Utilizator an_drey_curentandreycurent an_drey_curent Data 18 februarie 2012 22:09:52
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#define MAX 30005
int N,ARB[4*MAX],POZ,VAL,V[MAX],ANSWER[MAX];
inline int suma(int x,int y)
{return x+y;}
void actualizare(int NOD,int st,int dr)
{
	if (st==dr)
	{
		ARB[NOD]=1;
		return;
	}
	int mij = (st+dr)/2;
	if(POZ<=mij)
		actualizare(NOD*2,st,mij);
	else
		actualizare(NOD*2+1,mij+1,dr);
	ARB[NOD]=suma(ARB[NOD*2],ARB[NOD*2+1]);
}
void interogare(int NOD,int st,int dr)
{
	if(st==dr)
	{
		ARB[NOD]=0;VAL=st;
		return ;
	}
	int mij= (st+dr)/2;
	if(POZ<=ARB[NOD*2])
		interogare(NOD*2,st,mij);
	else
	{
		POZ-=ARB[NOD*2];
		interogare(NOD*2+1,mij+1,dr);
	}
	ARB[NOD]=suma(ARB[NOD*2],ARB[NOD*2+1]);
}
void deschidere()
{
	freopen("schi.in","r",stdin);
	freopen("schi.out","w",stdout);
}
void citire()
{
	scanf("%d",&N);int i;
	for(i=1;i<=N;i++)
	{
		scanf("%d",&V[i]);
		POZ=i;VAL=1;
		actualizare(1,1,N);
	}
}
void rezolvare()
{
	int i;
	for(i=N;i>=1;i--)
	{
		POZ=V[i];
		interogare(1,1,N);
		ANSWER[VAL]=i;
	}
}
void afisare()
{
	for(int i=1;i<=N;i++)
		printf("%d\n",ANSWER[i]);
}
int main()
{
	deschidere();
	citire();
	rezolvare();
	afisare();
	return 0;
}