Cod sursa(job #1400588)

Utilizator robertstrecheStreche Robert robertstreche Data 25 martie 2015 12:48:53
Problema Schi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#define NMAX 30005

using namespace std;

bool ok=1;
int n,poz,val,a[NMAX];
int sol[NMAX],tree[NMAX];

inline void update(int nod,int st,int dr)
{
    if (st==dr)tree[nod]=ok;
    else
    {
        int m=(st+dr)>>1;
        if (poz<=m)update(2*nod,st,m);
        else update(2*nod+1,m+1,dr);
        tree[nod]=tree[2*nod]+tree[2*nod+1];
    }
}
inline int query(int nod,int st,int dr)
{
    if (st==dr)return st;
    int m=(st+dr)>>1;
    if (tree[2*nod]>=val)
       return query(2*nod,st,m);
    val-=tree[2*nod];
    return query(2*nod+1,m+1,dr);
}
int main()
{
   freopen("schi.in","r",stdin);
   freopen("schi.out","w",stdout);
   scanf("%d",&n);
   for (int i=1;i<=n;i++)
   {
     scanf("%d",&a[i]);
     poz=i;
     update(1,1,n);
   }
   ok=0;
   for (int i=n;i;i--)
   {
       val=a[i];
       poz=query(1,1,n);
       sol[poz]=i;
       update(1,1,n);
   }
   for (int i=1;i<=n;i++)printf("%d\n",sol[i]);

   fclose(stdin);
   fclose(stdout);
}