Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #3362538) | Cod sursa (job #3363011)
#include <fstream>
using namespace std;
ifstream cin("schi.in");
ofstream cout("schi.out");
int arr[30001],ans[30001],aint[120001];
void build(int node, int st,int dr)
{
if(st==dr)
{
aint[node]=1;
return;
}
else
{
int mid=(st+dr)/2;
build(node*2,st,mid);
build(node*2+1,mid+1,dr);
aint[node]=aint[node*2]+aint[node*2+1];
}
}
void update(int pos,int node,int st,int dr)
{
if(st==dr)
{
aint[node]=0;
return;
}
int mid=(st+dr)/2;
if(pos<=mid)
update(pos,node*2,st,mid);
else
update(pos,node*2+1,mid+1,dr);
aint[node]=aint[node*2]+aint[node*2+1];
}
int cb(int node,int st,int dr,int val)
{
if(st==dr)
return st;
int mid=(st+dr)/2;
if(val>aint[node*2])
{
val-=aint[node*2];
return cb(node*2+1,mid+1,dr,val);
}
return cb(node*2,st,mid,val);
}
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++)
cin>>arr[i];
build(1,1,n);
for(int i=n;i;i--)
{
int poz=cb(1,1,n,arr[i]);
ans[poz]=i;
update(poz,1,1,n);
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<'\n';
return 0;
}