Pagini recente » Cod sursa (job #2283939) | Cod sursa (job #1640603) | Cod sursa (job #2779956) | Cod sursa (job #269937) | Cod sursa (job #3338887)
#include <fstream>
#include <vector>
using namespace std;
const int MAXN = 30005;
int poz[MAXN];
int sol[MAXN];
int tree[4 * MAXN];
void build(int nod, int st, int dr) {
if (st == dr) {
tree[nod] = 1;
return;
}
int mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
tree[nod] = tree[2 * nod] + tree[2 * nod + 1];
}
int schimb(int nod, int st, int dr, int k) {
if (st == dr) {
tree[nod] = 0;
return st;
}
int mid = (st + dr) / 2;
int pos;
if (tree[2 * nod] >= k) {
pos = schimb(2 * nod, st, mid, k);
} else {
pos = schimb(2 * nod + 1, mid + 1, dr, k - tree[2 * nod]);
}
tree[nod] = tree[2 * nod] + tree[2 * nod + 1];
return pos;
}
int main() {
ifstream fin("schi.in");
ofstream fout("schi.out");
int N;
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> poz[i];
}
build(1, 1, N);
for (int i = N; i >= 1; i--) {
int position = schimb(1, 1, N, poz[i]);
sol[position] = i;
}
for (int i = 1; i <= N; i++) {
fout << sol[i] << "\n";
}
return 0;
}