Pagini recente » Cod sursa (job #1999243) | Cod sursa (job #2250288) | Rating Stratulat Cristian (cristian_stratulat) | Cod sursa (job #2252846) | Cod sursa (job #715118)
Cod sursa(job #715118)
#include <stdio.h>
#include <math.h>
long i, n, v[30010], aux, ok, ab[66010], s[30010], dex[30010];
void init(long st, long dr, long poz) {
if (st == dr) {
ab[poz] = 1;
return;
}
init(st, (st + dr) / 2, poz * 2);
init((st + dr) / 2 + 1, dr, poz * 2 + 1);
ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
}
void act(long st, long dr, long poz) {
if (st == dr || ok == 1) {
if (ok == 0) {
ab[poz] = 0;
s[++s[0]] = st;
}
ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
ok = 1;
return;
}
if (ab[poz * 2] < aux) {
aux -= ab[poz * 2];
act((st + dr) / 2 + 1, dr, poz * 2 + 1);
ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
} else {
act(st, (st + dr) / 2, poz * 2);
ab[poz] = ab[poz * 2] + ab[poz * 2 + 1];
}
}
int main() {
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
scanf("%ld", &n);
for (i = 1; i <= n; ++i) scanf("%ld", &v[i]);
init(1, n, 1);
for (i = n; i >= 1; --i) {
ok = 0;
aux = v[i];
act(1, n, 1);
}
for (i = n; i >= 1; --i) {
dex[s[i]] = n - i + 1;
}
for (i = 1; i <= n; ++i) {
printf("%ld\n", dex[i]);
}
return 0;
}