Pagini recente » Cod sursa (job #3325463) | Cod sursa (job #1533764) | Cod sursa (job #122617) | Cod sursa (job #2739860) | Cod sursa (job #3318270)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
const int MAX = 30001;
int n, v[MAX], seg[4 * MAX], sol[MAX];
void build(int node, int st, int dr){
if(st == dr){
seg[node] = 1;
}
else{
int m = st + dr >> 1;
build(node << 1, st, m);
build(node << 1 | 1, m + 1, dr);
seg[node] = seg[node << 1] + seg[node << 1 | 1];
}
}
void update(int node, int st, int dr, int poz){
if(st == dr){
seg[node] = 0;
}
else{
int m = st + dr >> 1;
if(poz <= m)
update(node << 1, st, m, poz);
else
update(node << 1 | 1, m + 1, dr, poz);
seg[node] = seg[node << 1] + seg[node << 1 | 1];
}
}
int find_poz(int node, int st, int dr, int sum){
if(st == dr)
return st;
else{
int m = st + dr >> 1;
if(sum <= seg[node << 1])
return find_poz(node << 1, st, m, sum);
return find_poz(node << 1 | 1, m + 1, dr, sum - seg[node << 1]);
}
}
int main(){
fin >> n;
build(1, 1, n);
for(int i = 1; i <= n; ++i)
fin >> v[i];
for(int i = n; i >= 1; --i){
int t = find_poz(1, 1, n, v[i]);
update(1, 1, n, t);
sol[t] = i;
}
for(int i = 1; i <= n; ++i)
fout << sol[i] << '\n';
}