Pagini recente » Cod sursa (job #2936116) | Cod sursa (job #687118) | Cod sursa (job #733462) | Cod sursa (job #468304) | Cod sursa (job #1331786)
#include <stdio.h>
using namespace std;
int n, v[30005],arb[30005], sol[30005];
void update(int x)
{
while (x<=n)
{
++arb[x];
x += x&(x-1)^x;
}
}
int query(int x)
{
int sum = 0;
while (x)
{
sum += arb[x];
x -= x&(x-1)^x;
}
return sum;
}
int bsearch(int x)
{
int li=x+query(x), ls=n,m,sol=n;
while (li<=ls)
{
m=(li+ls)/2;
if (m-query(m)>=x)
{
sol = m;
ls = m-1;
}
else
li = m+1;
}
return sol;
}
int main()
{
FILE *fin,*fout;
fin=fopen("schi.in", "r");
fout=fopen("schi.out", "w");
fscanf(fin,"%d", &n);
for (int i=1; i<=n; ++i)
fscanf(fin,"%d", &v[i]);
int pos;
for (int i=n; i; --i)
{
pos=bsearch(v[i]);
sol[ bsearch(v[i]) ] = i;
update(pos);
}
for (int i=1; i<=n; ++i)
fprintf(fout,"%d \n", sol[i]);
}