Cod sursa(job #323535)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 12 iunie 2009 16:13:10
Problema Schi Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#define N 310
int n,t[3*N];
int v[N];
int sol[N];

inline int left(int x)
{
    return x<<1;
}

inline int right(int x)
{
    return (x<<1)+1;
}

inline void citire()
{
    scanf("%d",&n);
    for(int i=1; i<=n; ++i)
	scanf("%d",&v[i]);
}

void init(int p,int u,int poz)
{
    if(p>u)
	return;
    if(p==u)
    {
	t[poz]=1;
	return;
    }
    int m=(p+u)>>1;
    init(p,m,left(poz));
    init(m+1,u,right(poz));
    t[poz]=t[left(poz)]+t[right(poz)];
}

int afla(int p,int u,int poz,int x)
{
    --t[poz];
    if(p==u)
	return p;
    if(t[left(poz)]>=x)
	return afla(p,(p+u)>>1,left(poz),x);
    else
	return afla(((p+u)>>1)+1,u,right(poz),x-t[left(poz)]);
}

int main()
{
    freopen("schi.in","r",stdin);
    freopen("schi.out","w",stdout);
    citire();
    init(1,n,1);
    for(int i=n; i; --i)
	sol[afla(1,n,1,v[i])]=i;
    for(int i=1; i<=n; ++i)
	printf("%d\n",sol[i]);
    return 0;
}