Cod sursa(job #715120)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 16 martie 2012 18:14:18
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <math.h>

long i, n, v[30010], aux, ab[66010], s[30010], dex[30010];

void init(long st, long dr, long poz) {
	if (st == dr) {
		ab[poz] = 1;
		return;
	}
	init(st, (st + dr) / 2, poz * 2);
	init((st + dr) / 2 + 1, dr, poz * 2 + 1);
	ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
}

void act(long st, long dr, long poz) {
	if (st == dr) {
		ab[poz] = 0;
		s[++s[0]] = st;
		
		return;
	}
	if (ab[poz * 2] < aux) {
		aux -= ab[poz * 2];
		act((st + dr) / 2 + 1, dr, poz * 2 + 1);
		ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
	} else {
		act(st, (st + dr) / 2, poz * 2);
		ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
	}
}

int main() {
	freopen("schi.in", "r", stdin);
	freopen("schi.out", "w", stdout);
	
	scanf("%ld", &n);
	for (i = 1; i <= n; ++i) scanf("%ld", &v[i]);
	
	init(1, n, 1);
	for (i = n; i >= 1; --i) {
		aux = v[i];
		act(1, n, 1);
	}
	
	for (i = n; i >= 1; --i) {
		dex[s[i]] = n - i + 1;
	}
	for (i = 1; i <= n; ++i) {
		printf("%ld\n", dex[i]);
	}
	return 0;
}