Cod sursa(job #90205)

Utilizator raula_sanChis Raoul raula_san Data 8 octombrie 2007 20:50:52
Problema Schi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>

#define maxN 30003
#define maxT 60006

int A[maxN], F[maxN], T1[maxT];
int N, x;

int max(int a, int b) { return a > b ? a : b; }

void build(int n, int st, int dr)
{
	if(n < 60006)
	{
	
	T1[n] = dr - st + 1;

	if(st != dr)
	{
		int m = (st + dr) >> 1;
		build(n<<1, st, m); build((n<<1)+1, m+1, dr);
	}
	
	}
}

void search(int n, int st, int dr, int p)
{
	if(st == dr && n < 60006)
	{
		x = dr;
		-- T1[n];
	}
	else if(n < 30003)
	{
		int m = (st + dr) >> 1;
		if(T1[n<<1] >= p)
		{
			search(n<<1, st, m, p);
			-- T1[n];
		}
		else
		{
			search((n<<1)+1, m+1, dr, p-T1[n<<1]);
			-- T1[n];
		}
	}
}

int main()
{
	freopen("schi.in", "rt", stdin);
	freopen("schi.out", "wt", stdout);

	int i;
	for(scanf("%d", &N), i=1; i<=N; ++i)
		scanf("%d", A+i);

	build(1, 1, N);

	for(i=N; i>=1; --i)
	{
		search(1, 1, N, A[i]);
		F[x] = i;
	}
	
	for(i=1; i<=N; ++i) printf("%d\n", F[i]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}