Cod sursa(job #757653)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 12 iunie 2012 21:12:49
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <cstdio>
#define N 30010

using namespace std;

FILE* fin=fopen("schi.in","r");
FILE* fout=fopen("schi.out","w");
const int maxb=8192;
char buf[maxb];
int ptr=0;

inline int GetInt()
{
    int nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    while ('0'<=buf[ptr]&&buf[ptr]<='9')
    {
        nr=nr*10+buf[ptr]-'0';
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    }
    return nr;
}

int n,i,AI[4*N],ANS[N],V[N],val,poz;

void Update (int nod, int l, int r)
{
    if (l==r)
    {
        AI[nod]=val;
        return;
    }
    int m=(l+r)/2;
    if (poz<=m) Update(2*nod,l,m);
        else Update(2*nod+1,m+1,r);
    AI[nod]=AI[2*nod]+AI[2*nod+1];
}

void Query (int nod, int l, int r)
{
    if (l==r)
    {
        poz=l;
        return;
    }
    int m=(l+r)/2;
    if (val<=AI[2*nod]) Query(2*nod,l,m);
        else
        {
            val-=AI[2*nod];
            Query(2*nod+1,m+1,r);
        }
}

int main ()
{
    n=GetInt();
    for (i=1;i<=n;i++)
    {
        V[i]=GetInt();
        poz=i;val=1;
        Update(1,1,n);
    }

    for (i=n;i>=1;i--)
    {
        val=V[i];
        Query(1,1,n);
        ANS[poz]=i;
        val=0;
        Update(1,1,n);
    }

    for (i=1;i<=n;i++)
        fprintf(fout,"%d\n",ANS[i]);
    fclose(fin);fclose(fout);
    return 0;
}