Pagini recente » Cod sursa (job #2915875) | Cod sursa (job #2551859) | Cod sursa (job #2957640) | Cod sursa (job #429359) | Cod sursa (job #3200228)
#include <iostream>
#include <fstream>
#define Nmax 30005
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
int n,a[3*Nmax];
void build(int nod,int st,int dr)
{
if(st==dr)
{
a[nod]=1;
return;
}
int mij=((st+dr)/2);
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
a[nod]=a[2*nod]+a[2*nod+1];
}
void update(int nod,int st,int dr,int pozi)
{
if(st==dr)
{
a[nod]=0;
return;
}
int mij=((st+dr)/2);
if(pozi<=mij)
{
update(2*nod,st,mij,pozi);
}
else
{
update(2*nod+1,mij+1,dr,pozi);
}
a[nod]=a[2*nod]+a[2*nod+1];
}
int query(int nod,int st,int dr,int x)
{
if(st==dr)
{
return st;
}
int mij=((st+dr)/2);
if(x<=a[2*nod])
{
return query(2*nod,st,mij,x);
}
else
{
return query(2*nod+1,mij+1,dr,x-a[2*nod]);
}
}
int main()
{
int n,poz,sol[Nmax],val[Nmax];
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>val[i];
}
build(1,1,n);
for(int i=n;i>=1;i--)
{
int poz=query(1,1,n,val[i]);
sol[poz]=i;
update(1,1,n,poz);
}
for(int i=1;i<=n;i++)
{
fout<<sol[i]<<'\n';
}
return 0;
}