Cod sursa(job #1794511)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 1 noiembrie 2016 13:15:01
Problema Schi Scor 55
Compilator c Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <stdlib.h>
int q[30001],sol[30001],arb[70001],val,x,obs;
void update(int st,int dr,int pos,int x)
{
    if(st!=dr){
        if(x>(st+dr)/2) update((st+dr)/2+1,dr,pos*2+1,x);
        else update(st,(st+dr)/2,pos*2,x);
    }
    arb[pos]--;
}
void search(int st,int dr,int pos)
{
    if(x<val){
        if(arb[pos]!=dr-st+1)
        {
            if(arb[pos]!=0)
            {
                search(st,(st+dr)/2,pos*2);
                search((st+dr)/2+1,dr,pos*2+1);
            }
            else
                obs+=(dr-st+1);
        }
        else
        {
            if(x+(dr-st+1)<val)
                x+=(dr-st+1);
            else
                x=val;
        }
    }
}
void form(int st,int dr,int pos){
    if(st!=dr){
        form(st,(st+dr)/2,pos*2);
        form((st+dr)/2+1,dr,pos*2+1);
    }
    arb[pos]=dr-st+1;
}
int main()
{
    int i,n;
    freopen("schi.in","r",stdin);
    freopen("schi.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; i++)
        scanf("%d",&q[i]);
    form(1,n,1);
    for(i=n; i>0; i--)
    {
        val=q[i];
        x=0;
        obs=0;
        search(1,n,1);
        val+=obs;
        update(1,n,1,val);
        sol[val]=i;
    }
    for(i=1; i<=n; i++)
        printf("%d\n",sol[i]);

    return 0;
}