Pagini recente » Cod sursa (job #711686) | Cod sursa (job #956771) | Cod sursa (job #2554074) | Cod sursa (job #2247382) | Cod sursa (job #3319765)
#include <stdio.h>
#define MAXN 30000
int rez[MAXN+1];
int aib[MAXN+1];
int poz[MAXN+1];
int n;
int find(int x){
int poz=0,sum=0;
for(int pas=1<<15; pas; pas/=2){
if(poz+pas<=n&&sum+aib[poz+pas]<x){
poz+=pas;
sum+=aib[poz];
}
}
return poz+1;
}
void update(int i, int x){
while(i<=n){
aib[i]+=x;
i+=(i&(-i));
}
}
int main()
{
FILE *fin, *fout;
int i,ans;
fin=fopen("schi.in", "r");
fscanf(fin, "%d", &n);
for(i=0; i<n; i++){
fscanf(fin, "%d", &poz[i]);
}
fclose(fin);
for(i=1; i<=n; i++){
aib[i]++;
aib[i+(i&(-i))]+=aib[i];
}
for(i=n-1; i>=0; i--){
ans=find(poz[i]);
rez[ans]=i+1;
update(ans, -1);
}
fout=fopen("schi.out", "w");
for(i=1; i<=n; i++)
fprintf(fout, "%d\n", rez[i]);
fclose(fout);
return 0;
}