Cod sursa(job #1052442)

Utilizator Tudordmdaniel marin Tudordm Data 11 decembrie 2013 12:12:52
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>

int val,poz,t[1<<18],v[30001],h[30001],n,m,a,b,maxim;
const int INF=1e10;

int start;

int inline maxi(int d,int c){

    if(d<c)
        return c;
    return d;

}

void inline query(int p, int st, int dr)
{
     if ( a <= st && dr <= b )
     {
          if ( maxim < t[p] ) maxim = t[p];
          return;
     }

     int div = (st+dr)/2;
     if ( a <= div ) query(2*p,st,div);
     if ( div < b ) query(2*p+1,div+1,dr);
}

void inline update(int p,int st,int dr){

    int m;
    if(st==dr){

        t[p]=val;
        return;
    }
    m=(st+dr)/2;
    if(poz<=m)
        update(2*p,st,m);
    else
        update(2*p+1,m+1,dr);
    t[p]=maxi(t[2*p],t[2*p+1]);
}

void calcul(int p,int st,int dr){

    if(st==dr){

        v[st]=start;
        t[p]=1;
        return;
    }
    int m=(st+dr)/2,vrajeala=m-st+1-t[2*p];
    if(poz<=vrajeala)
        calcul(2*p,st,m);
    else{
        poz-=vrajeala;
        calcul(2*p+1,m+1,dr);
    }
    t[p]++;
}


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",&poz);
        h[i]=poz;

    }

    for(i=n;i>=1;i--){

        poz=h[i];
        start=i;
        calcul(1,1,n);

    }

    for(i=1;i<=n;i++){

        printf("%d\n",v[i]);

    }

    return 0;

}