Pagini recente » Cod sursa (job #421765) | Cod sursa (job #2615750) | Cod sursa (job #2672250) | Cod sursa (job #521621) | Cod sursa (job #2108188)
#include <bits/stdc++.h>
using namespace std;
const int NMax = 30010;
inline void debug()
{
#ifndef ONLINE_JUDGE
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
freopen("schi.in", "r", stdin);
freopen("schi.out", "w", stdout);
#endif
}
int v[NMax], arbInt[4 * NMax], solutie[NMax];
void buildTree(int node, int left, int right, int poz) {
if(left == right) {
arbInt[node] = 1;
return;
}
int mid = (left + right) >> 1;
if(poz <= mid)
buildTree(2 * node, left, mid, poz);
else
buildTree(2 * node + 1, mid + 1, right, poz);
arbInt[node] = arbInt[2 * node] + arbInt[2 * node + 1];
}
void find(int node, int left, int right, int poz, int current) {
if(left == right) {
arbInt[node] = 0;
solutie[left] = current;
return;
}
int mid = (left + right) >> 1;
if(poz <= arbInt[2 * node])
find(2 * node, left, mid, poz, current);
else
find(2 * node + 1, mid + 1, right, poz - arbInt[2 * node], current);
arbInt[node] = arbInt[2 * node] + arbInt[2 * node + 1];
}
int main()
{
debug();
int n;
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> v[i];
buildTree(1, 1, n, i);
}
for(int i = n; i > 0; --i)
find(1, 1, n, v[i], i);
for(int i = 1; i <= n; ++i)
cout << solutie[i] << '\n';
return 0;
}