Pagini recente » Cod sursa (job #3317984) | Cod sursa (job #291926) | Cod sursa (job #1344637) | Cod sursa (job #1783781) | Cod sursa (job #3338890)
#include <fstream>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
const int MAXN = 30000;
int N;
int poz[MAXN + 5];
int sol[MAXN + 5];
int arb[4 * MAXN + 5];
void build(int nod, int st, int dr) {
if (st == dr) {
arb[nod] = 1;
return;
}
int mid = (st + dr) / 2;
build(nod * 2, st, mid);
build(nod * 2 + 1, mid + 1, dr);
arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}
int query_k(int nod, int st, int dr, int k) {
if (st == dr)
return st;
int mid = (st + dr) / 2;
if (arb[nod * 2] >= k)
return query_k(nod * 2, st, mid, k);
else
return query_k(nod * 2 + 1, mid + 1, dr, k - arb[nod * 2]);
}
void update(int nod, int st, int dr, int poz) {
if (st == dr) {
arb[nod] = 0;
return;
}
int mid = (st + dr) / 2;
if (poz <= mid)
update(nod * 2, st, mid, poz);
else
update(nod * 2 + 1, mid + 1, dr, poz);
arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}
int main() {
fin >> N;
for (int i = 1; i <= N; i++)
fin >> poz[i];
build(1, 1, N);
for (int i = N; i >= 1; i--) {
int p = query_k(1, 1, N, poz[i]);
sol[p] = i;
update(1, 1, N, p);
}
for (int i = 1; i <= N; i++)
fout << sol[i] << "\n";
return 0;
}