Cod sursa(job #1408309)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 29 martie 2015 23:07:58
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <algorithm>
#define NMAX 30007
FILE *fin, *fout;
using namespace std;
int n, v[NMAX], arb[3*NMAX], st2, mij2, dr2, p, ans[NMAX];
void pun(int st, int dr, int pos, int nod)
{
	if(st == dr)
	{
		arb[nod] = 1;
		return;
	}
	int mij = (st+dr)/2;
	if(pos <= mij) pun(st, mij, pos, 2*nod);
	if(pos > mij) pun(mij+1, dr, pos, 2*nod+1);
	arb[nod] = arb[2*nod] + arb[2*nod+1];
}
int interogare(int st, int dr, int st1, int dr1, int nod)
{
	if(st == st1 && dr == dr1)
	{
		return arb[nod];
	}
	int mij = (st+dr)/2;
	if(dr1 <= mij) return interogare(st, mij, st1, dr1, 2*nod);
	if(st1 > mij) return interogare(mij+1, dr, st1, dr1, 2*nod+1);
	return interogare(st, mij, st1, mij, 2*nod) + interogare(mij+1, dr, mij+1, dr1, 2*nod+1);
}
int cautbin(int a)
{
	int pos, val;
	st2 = 1;
	dr2 = n;
	while(st2 <= dr2)
	{
		mij2 = (st2 + dr2)/2;
		val = mij2 - interogare(1, n, 1, mij2, 1);
		if(val < a)
		{
			st2 = mij2+1;
		}
		else
		{
			if(val == a) pos = mij2;
			dr2 = mij2-1;
		}
	}
	return pos;
}
int main()
{
	fin = freopen("schi.in", "r", stdin);
	fout = freopen("schi.out", "w", stdout);
	scanf("%d", &n);
	for(int i = n-1; i>= 0; i--) scanf("%d", &v[i]);
	for(int i = 0; i< n; i++)
	{
		p = cautbin(v[i]);
		pun(1, n, p, 1);
		ans[p] = n-i;
	}
	for(int i = 1; i<= n; i++) printf("%d\n", ans[i]);
	fclose(fin);
	fclose(fout);
	return 0;
}