Pagini recente » Cod sursa (job #1362178) | Cod sursa (job #1714109) | Cod sursa (job #1102274) | Cod sursa (job #2406110) | Cod sursa (job #3293552)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
const int LMAX = 30005;
const int INF = 0x3f3f3f3f;
const int MOD = 3210121;
int aint[LMAX*4], v[LMAX], clasament[LMAX];
void build(int node, int st, int dr) {
if (st == dr) {
aint[node] = 1;
}
else {
int mij = ((st + dr)>>1);
build(node*2, st, mij);
build(node*2 + 1, mij + 1, dr);
aint[node] = aint[node*2] + aint[node*2 + 1];
}
}
void update(int node, int st, int dr, int pos) {
if (st == dr) {
aint[node] = 0;
}
else {
int mij = ((st + dr)>>1);
if (pos <= mij) update(node*2, st, mij, pos);
else update(node*2 + 1, mij + 1, dr, pos);
aint[node] = aint[node*2] + aint[node*2 + 1];
}
}
int query(int node, int st, int dr, int k) {
if (st == dr) {
return st;
}
else {
int mij = ((st + dr)>>1);
if (aint[node*2] >= k) {
return query(node*2, st, mij, k);
}
else {
return query(node*2 + 1, mij + 1, dr, k - aint[node*2]);
}
}
}
int main() {
int n, i, pos;
fin>>n;
for (i = 1; i <= n; i++) {
fin>>v[i];
}
build(1, 1, n);
for (i = n; i > 0; i--) {
pos = query(1, 1, n, v[i]);//al v[i]-lea activ
clasament[pos] = i;
update(1, 1, n, pos);//dezactiveaza
}
for (i = 1; i <= n; i++) {
fout<<clasament[i]<<"\n";
}
fin.close();
fout.close();
return 0;
}