Pagini recente » Cod sursa (job #815315) | Cod sursa (job #2377716) | Cod sursa (job #1415289) | Cod sursa (job #185671) | Cod sursa (job #1046131)
#include <stdio.h>
using namespace std;
const int N=30002;
const int P=1<<17;
int v[N],t[P],loc[N],ocupant[N];
int n,val=1,poz,rez;
void query(int pozitie, int p, int st, int dr)
{
if(st==dr)
{
rez=st;
return;
}
int m=(st+dr)>>1;
if(m-st+1 - t[2*p] >= pozitie)
{
query(pozitie,p*2,st,m);
}
else
{
query(pozitie-(m-st+1 - t[2*p]),p*2+1,m+1,dr);
}
}
void update(int p, int st, int dr)
{
if(st==dr)
{
t[p]=val;
}
else
{
int m=st+dr; m>>=1;
if(poz<=m)
{
update(2*p,st,m);
}
else
{
update(2*p+1,m+1,dr);
}
t[p]=t[2*p]+t[2*p+1];
}
}
int main()
{
FILE *in,*out;
in=fopen("schi.in","r");
out=fopen("schi.out","w");
int i,j;
fscanf(in,"%d",&n);
for(i=1;i<=n;i++) fscanf(in,"%d",&v[i]);
for(i=1;i<=4*n;i++) t[i]=0;
for(i=n;i>=1;i--)
{
query(v[i],1,1,n);
loc[i]=rez;
poz=rez;
update(1,1,n);
}
for(i=1;i<=n;i++)
{
ocupant[loc[i]]=i;
}
for(i=1;i<=n;i++)
{
fprintf(out,"%d\n",ocupant[i]);
}
return 0;
}