Cod sursa(job #1111807)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 19 februarie 2014 09:49:18
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#define nmax 30005
using namespace std;

int arb[3*nmax+5];
int p[nmax];
int r[nmax];
int in[nmax];
int n;

void update(int pos,bool val,int k,int s,int f) {
	if (val) arb[k]++;
	else arb[k]--;
	if (s==f) return;
	int mij = (s+f)/2;
	if (pos <= mij) update(pos,val,2*k,s,mij);
	else update(pos,val,2*k+1,mij+1,f);
}

int querry(int val,int k,int s,int f) {
	if (s == f) {
		arb[k]--;
		return s;
	}
	int mij = (s+f)/2;
	int aux;
	if (arb[2*k] >= val) aux = querry(val,2*k,s,mij);
	else aux = querry(val-arb[2*k],2*k+1,mij+1,f);
	arb[k]--;
	return aux;
}

int main() {
	freopen("schi.in","r",stdin);
	freopen("schi.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++) update(i,true,1,1,n);
	for (int i=1;i<=n;i++) scanf("%d",&in[i]);
	for (int i=n;i>=1;i--) {
		p[i] = querry(in[i],1,1,n);
		//update(p[i],false,1,1,n);
	}
	for (int i=1;i<=n;i++) r[p[i]] = i;
	for (int i=1;i<=n;i++) printf("%d\n",r[i]);
	return 0;
}