Pagini recente » Cod sursa (job #1158044) | Cod sursa (job #2584375) | Cod sursa (job #3350448) | Cod sursa (job #3332289) | Cod sursa (job #3343124)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 30005;
int N;
int r[MAXN];
int tree[4 * MAXN];
int final[MAXN];
void build(int node, int l, int r) {
if (l == r) {
tree[node] = 1;
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
void update(int node, int l, int r, int pos, int val) {
if (l == r) {
tree[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
update(node * 2, l, mid, pos, val);
else
update(node * 2 + 1, mid + 1, r, pos, val);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
int gs(int node, int l, int r, int k) {
if (l == r) return l;
int mid = (l + r) / 2;
if (k <= tree[node * 2])
return gs(node * 2, l, mid, k);
else
return gs(node * 2 + 1, mid + 1, r, k - tree[node * 2]);
}
int main()
{
ifstream fin("schi.in");
ofstream fout("schi.out");
fin >> N;
for (int i = 1; i <= N; i++)
fin >> r[i];
build(1, 1, N);
for (int i = N; i >= 1; i--) {
int pos = gs(1, 1, N, r[i]);
final[pos] = i;
update(1, 1, N, pos, 0);
}
for (int i = 1; i <= N; i++)
fout << final[i] << "\n";
return 0;
}