Cod sursa(job #928154)
#include<fstream>
#define NMAX 30010
using namespace std;
int n, a[NMAX], sum[NMAX], loc[NMAX];
ifstream f("schi.in");
ofstream g("schi.out");
void Citeste()
{
f>>n;
for (int i=1; i<=n; ++i) f>>a[i];
}
inline int ultim(int x)
{
return x ^ ( x & (x-1) );
}
void Init()
{
for (int i=1; i<=n; ++i)
sum[i]=ultim(i);
}
void Update(int pz, int val)
{
for ( ; pz<=n; pz+=ultim(pz)) sum[pz]+=val;
}
int Query(int pz)
{
int rez=0;
for ( ; pz>0; pz-=ultim(pz))
rez+=sum[pz];
return rez;
}
void Solve()
{
int i, st, dr, mij, gata, S;
for (i=n; i>0; --i)
{
gata=0;
st=1, dr=n;
while (st<=dr)
{
mij=(st+dr)/2;
S=Query(mij);
if (S>=a[i])
{
gata=mij;
dr=mij-1;
}
else st=mij+1;
}
loc[gata]=i;
Update(gata, -1);
}
}
void Scrie()
{
for (int i=1; i<=n; ++i) g<<loc[i]<<"\n";
}
int main()
{
Citeste();
Init();
Solve();
Scrie();
f.close();
g.close();
return 0;
}