Cod sursa(job #563206)

Utilizator bogfodorBogdan Fodor bogfodor Data 24 martie 2011 19:00:19
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#define Lmax 30005

using namespace std;

FILE *fin=freopen("schi.in","r",stdin);
FILE *fout=freopen("schi.out","w",stdout);

int heap[4*Lmax],a[Lmax],n,sol[Lmax];
int rez;

void add(int st, int dr, int nod, int p)
{
    if(st==dr)
    {
        heap[nod]=1;
        return;
    }
    int mid=(st+dr)>>1;
    int newnod=nod<<1;
    if(p<=mid)
        add(st,mid,newnod,p);
    else
        add(mid+1,dr,newnod+1,p);
    heap[nod]=heap[newnod]+heap[newnod+1];
}

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

void find(int st, int dr, int nod, int p)
{
    if(st==dr)
    {
        heap[nod]=0;
        rez=st;
        return;
    }
    int mid=(st+dr)>>1;
    int newnod=nod<<1;
    if(heap[newnod]>=p)
        find(st,mid,newnod,p);
    else
        find(mid+1,dr,newnod+1,p-heap[newnod]);
    heap[nod]=heap[newnod]+heap[newnod+1];
}

void solve()
{
    for(int i=1;i<=n;i++)
        add(1,n,1,i);
    for(int i=n;i>0;i--)
    {
        find(1,n,1,a[i]);
        sol[rez]=i;
    }
}

void afisare()
{
    for(int i=1;i<=n;i++)
        printf("%d\n", sol[i]);
}

int main()
{
    citire();
    solve();
    afisare();
    return 0;
}