Pagini recente » Cod sursa (job #99544) | Cod sursa (job #1092115) | Cod sursa (job #2650464) | Cod sursa (job #2099145) | Cod sursa (job #563206)
Cod sursa(job #563206)
#include <cstdio>
#define Lmax 30005
using namespace std;
FILE *fin=freopen("schi.in","r",stdin);
FILE *fout=freopen("schi.out","w",stdout);
int heap[4*Lmax],a[Lmax],n,sol[Lmax];
int rez;
void add(int st, int dr, int nod, int p)
{
if(st==dr)
{
heap[nod]=1;
return;
}
int mid=(st+dr)>>1;
int newnod=nod<<1;
if(p<=mid)
add(st,mid,newnod,p);
else
add(mid+1,dr,newnod+1,p);
heap[nod]=heap[newnod]+heap[newnod+1];
}
void citire()
{
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d", &a[i]);
}
}
void find(int st, int dr, int nod, int p)
{
if(st==dr)
{
heap[nod]=0;
rez=st;
return;
}
int mid=(st+dr)>>1;
int newnod=nod<<1;
if(heap[newnod]>=p)
find(st,mid,newnod,p);
else
find(mid+1,dr,newnod+1,p-heap[newnod]);
heap[nod]=heap[newnod]+heap[newnod+1];
}
void solve()
{
for(int i=1;i<=n;i++)
add(1,n,1,i);
for(int i=n;i>0;i--)
{
find(1,n,1,a[i]);
sol[rez]=i;
}
}
void afisare()
{
for(int i=1;i<=n;i++)
printf("%d\n", sol[i]);
}
int main()
{
citire();
solve();
afisare();
return 0;
}