Pagini recente » Cod sursa (job #1185913) | Cod sursa (job #971708) | Cod sursa (job #2779439) | Cod sursa (job #3248186) | Cod sursa (job #1743178)
#include <fstream>
#include <iostream>
using namespace std;
ifstream in("schi.in");
ofstream out("schi.out");
int aib[30001],init[30001],fin[30001];
int n;
int query(int x)
{
int sol=0,i;
for(i=x;i>0;i=(i&(i-1)))
{
sol=sol+aib[i];
}
return sol;
}
void citeste()
{
for(int i=1;i<=n;i++)
{
aib[i]=1;
}
for(int i=1;i<=n;i++)
{
in>>init[i];
aib[i]+=query(i-1)-query(i&(i-1));
}
}
void update(int x,int y)
{
for(int i=x;i<=n;i=i*2-(x&(x-1)))
{
aib[i]+=y;
}
}
int caut(int s)
{
int st,dr,m,sum,sol;
st=1; dr=n; sol=-1;
while(st<=dr)
{
m=(st+dr)/2;
sum=query(m);
if(sum==s)
{
sol=m;
dr=m-1;
break;
}
else if(sum>s)
dr=m-1;
else
st=m+1;
}
return sol;
}
int rezolva()
{
for(int i=n;i>0;i--)
{
int sol;
sol=caut(init[i]);
fin[sol]=i;
update(sol,-1);
}
for(int i=1;i<=n;i++)
out<<fin[i]<<" ";
}
int main()
{
in>>n;
citeste();
rezolva();
}