Pagini recente » Cod sursa (job #3339628) | Borderou de evaluare (job #2488740) | Diferente pentru problema/zero2 intre reviziile 12 si 1 | Cod sursa (job #3315501) | Cod sursa (job #3335002)
#include <bits/stdc++.h>
using namespace std;
typedef long long i8;
ifstream fin("ski.in");
ofstream fout("ski.out");
class AINT {
private:
vector<int> v;
vector<int> res;
int n;
void build(int node, int st, int dr) {
if (st == dr) {
v[node] = 1;
} else {
int mid = (st + dr) / 2;
build(node * 2, st, mid);
build(node * 2 + 1, mid + 1, dr);
v[node] = v[node * 2] + v[node * 2 + 1];
}
}
public:
void strt(int node) {
n = node;
v.assign(4 * n, 0);
res.assign(n, 0);
build(1, 0, n - 1);
};
void update(int node, int st, int dr, int e, int poz) {
if (st == dr) {
res[st] = e;
v[node] = 0;
return;
}
int mid = (st + dr) / 2;
if (poz < v[node * 2]) {
update(node * 2, st, mid, e, poz);
} else {
update(node * 2 + 1, mid + 1, dr, e, poz - v[node * 2]);
}
v[node] = v[node * 2] + v[node * 2 + 1];
}
void wrt() {
for (int i = 0; i < n; i++) {
fout << res[i] << "\n";
}
}
};
int main() {
int n;
cin >> n;
AINT seg;
seg.strt(n);
vector<int> a(n);
for (int i = 0; i < n; i++) {
fin >> a[i];
}
for (int i = n - 1; i >= 0; i--) {
seg.update(1, 0, n - 1, i + 1, a[i] - 1);
}
seg.wrt();
return 0;
}