Pagini recente » Cod sursa (job #1942308) | Cod sursa (job #2691357) | Borderou de evaluare (job #528025) | Cod sursa (job #2925758) | Cod sursa (job #3182809)
#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
const int LMAX = 30005;
int aint[LMAX*3], v[LMAX], sol[LMAX], i;
int build(int nod, int st, int dr) {
if (st == dr) {
aint[nod] = 1;
return aint[nod];
}
else {
int mij = ((st + dr)>>1);
aint[nod] = build(nod*2, st, mij) + build(nod*2 + 1, mij+1, dr);
return aint[nod];
}
}
int update(int nod, int st, int dr, int k) {
if (st == dr) {
sol[st] = i;
aint[nod] = 0;
return aint[nod];
}
else {
int mij = ((st + dr)>>1);
if (aint[2*nod] >= k) {
aint[nod] = update(2*nod, st, mij, k) + aint[nod*2 + 1];
}
else {
aint[nod] = update(2*nod + 1, mij + 1, dr, k - aint[nod*2]) + aint[nod*2];
}
return aint[nod];
}
}
/*int query1(int nod, int st, int dr, int a, int b) {
if (st == dr && st == a) {
aint[nod] = b;
return aint[nod];
}
else {
int mij = ((st + dr) >> 1);
if (mij >= a) {
aint[nod] = max(aint[nod * 2 + 1], query1(nod*2, st, mij,a , b));
}
else {
aint[nod] = max(aint[nod * 2], query1(nod*2 + 1, mij+1, dr, a, b));
}
return aint[nod];
}
}*/
int main() {
int n, m, a, b;
bool op;
fin >> n;
for (i = 1; i <= n; i++) {
fin >> v[i];
}
build(1,1, n);
for (i = n; i >= 1; i--) {
update(1, 1, n, v[i]);
}
for (i = 1; i <= n; i++) {
fout << sol[i] << endl;
}
fin.close();
fout.close();
return 0;
}