Cod sursa(job #218523)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 2 noiembrie 2008 13:49:03
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
//schi cu aib

#include <cstdio>
#define MAXIMUS 30002
#define f(x)((x^(x-1))&x)

using namespace std;

int n,m,arb[MAXIMUS],sol[MAXIMUS],sir[MAXIMUS];

void update(int pozitie,int valoare)
{
    while(pozitie<=n)
    {
        arb[pozitie]+=valoare;
        pozitie+=f(pozitie);
    }
}

int aduna(int pozitie)
{
    int s=0;
    while(pozitie>0)
    {
        s+=arb[pozitie];
        pozitie-=f(pozitie);
    }
    return s;
}

int minim(int x)
{
    int p,i;
    for(p=1;p<n;p*=2);
        for(i=n;p;p/=2)
            if(i-p>=1)
                if(x<=aduna(i-p))
                      i-=p;
    return i;
}

void solve()
{
      int zz;
      for(int i=0;i<n;i++)
          update(i+1,1);
      for(int i=n;i;i--)
      {
          zz=minim(sir[i-1]);
          sol[zz]=i;
          update(zz,-1);
      }
}

int main(){
    freopen("schi.in","r",stdin);
    freopen("schi.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&sir[i]);
    solve();
    for(int i=1;i<=n;i++)
        printf("%d\n",sol[i]);
    fclose(stdout);
    return 0;
}