Pagini recente » Cod sursa (job #3133076) | Cod sursa (job #1397580) | Cod sursa (job #1884797) | Cod sursa (job #985936) | Cod sursa (job #1266705)
#include <cstdio>
#define filein "schi.in"
#define fileout "schi.out"
using namespace std;
int v[30001],aib[30001],sol[30001];
int N;
void ReadData();
void PrintData();
inline int LSB(int x);
void Update(int poz, int val);
int Query(int b);
int BIN_SEARCH(int st, int dr, int val);
int main()
{
ReadData();
int aux;
register int i;
for (i=N; i; i--)
{
aux=BIN_SEARCH(1,N,v[i]);
sol[aux]=i;
Update(aux,-1);
}
PrintData();
return 0;
}
void ReadData()
{
FILE *in;
in=fopen(filein,"r");
register int i;
fscanf(in,"%d",&N);
for (i=1; i<=N; i++)
{
fscanf(in,"%d",v+i);
Update(i,1);
}
fclose(in);
}
void PrintData()
{
FILE *out;
out=fopen(fileout,"w");
register int i;
for (i=1; i<=N; i++)
fprintf(out,"%d\n",sol[i]);
fclose(out);
}
inline int LSB(int x)
{
return x&-x;
}
void Update(int poz, int val)
{
for (; poz<=N; poz+=LSB(poz))
aib[poz]+=val;
}
int Query(int b)
{
int s=0;
for (; b; b-=LSB(b))
s+=aib[b];
return s;
}
int BIN_SEARCH(int st, int dr, int val)
{
int mij;
while (st<=dr)
{
mij=(st+dr)>>1;
if (val<=Query(mij))
dr=mij-1;
else st=mij+1;
}
return st;
}