Pagini recente » Cod sursa (job #238216) | Rating Mihai Nicolae (mihainicolae80) | Mozaic | Profil Tudorg | Cod sursa (job #2019564)
#include <bits/stdc++.h>
using namespace std;
ifstream f("schi.in");
ofstream g("schi.out");
int N;
int lsb(int x) {
return x & (-x);
}
void update(vector < int > &a, int pos, int val) {
for (; pos <= N; pos += lsb(pos)) {
a[pos] += val;
}
}
int query(vector < int > &a, int pos) {
int res = 0;
for (; pos; pos -= lsb(pos)) {
res += a[pos];
}
return res;
}
int main() {
f >> N;
vector < int > aib(N + 1), a(N + 1), sol(N + 1);
for (int i = 1; i <= N; ++i) {
f >> a[i];
update(aib, i, 1);
}
for (int i = N; i > 0; --i) {
int pos = 0;
for (int step = (1 << 25); step; step >>= 1) {
if (pos + step <= N && query(aib, pos + step) <= a[i] - 1) {
pos += step;
}
}
//cout << a[i] << ' ' << pos << ' ' << query(aib, pos) << '\n';
sol[pos + 1] = i;
update(aib, pos + 1, -1);
}
for (int i = 1; i <= N; ++i) {
cout << sol[i] << '\n';
}
return 0;
}