Mai intai trebuie sa te autentifici.
Cod sursa(job #1366650)
Utilizator | Data | 1 martie 2015 12:34:07 | |
---|---|---|---|
Problema | Schi | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.02 kb |
#include <cstdio>
#define NMAX 30010
using namespace std;
int v[NMAX],sol[NMAX],n,i,A[3*NMAX],pos,Anod;
void Abuild(int nod,int st,int dr)
{
int mij;
A[nod]=dr-st+1;
if(st==dr)
return;
mij=st+(dr-st)/2;
Abuild(2*nod,st,mij);
Abuild(2*nod+1,mij+1,dr);
}
void Afind(int nod,int sum,int st,int dr)
{
int mij;
if(st==dr)
{
pos=st;
Anod=nod;
return;
}
mij=st+(dr-st)/2;
if(sum<=A[2*nod]) Afind(2*nod,sum,st,mij);
else Afind(2*nod+1,sum-A[2*nod],mij+1,dr);
}
void Aclear(int nod)
{
--A[nod];
if(nod==1)
return;
Aclear(nod/2);
}
int main()
{
freopen("schi.in","r",stdin);
freopen("schi.out","w",stdout);
scanf("%d\n",&n);
for(i=1; i<=n; ++i)
scanf("%d\n",&v[++v[0]]);
Abuild(1,1,n);
for(i=n; i>=1; --i)
{
Afind(1,v[i],1,n);
sol[pos]=i;
Aclear(Anod);
}
for(i=1; i<=n; ++i)
printf("%d\n",sol[i]);
return 0;
}