Pagini recente » Monitorul de evaluare | Cod sursa (job #666081) | Diferente pentru home intre reviziile 883 si 903 | Diferente pentru sandbox intre reviziile 568 si 578 | Cod sursa (job #3306886)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 30005;
int n, v[Nmax], aint[4*Nmax], sol[Nmax];
// aint[nod] = cate celule libere sunt in intervalul nod
void Build(int nod, int st, int dr){
if(st == dr){
aint[nod] = 1;
return;
}
int mid = (st + dr) / 2;
Build(2*nod, st, mid);
Build(2*nod+1, mid+1, dr);
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
void Update(int nod, int st, int dr, int poz){
if(st == dr){
aint[nod] = 0;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid){
Update(2*nod, st, mid, poz);
}
else{
Update(2*nod+1, mid+1, dr, poz);
}
aint[nod] = aint[2*nod] + aint[2*nod+1];
}
int Query(int nod, int st, int dr, int x){
if(st == dr){
return st;
}
int mid = (st + dr) / 2;
if(x <= aint[2*nod]){
return Query(2*nod, st, mid, x);
}
else{
return Query(2*nod+1, mid+1, dr, x-aint[2*nod]);
}
}
int main()
{
ifstream fin("schi.in");
ofstream fout("schi.out");
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
Build(1, 1, n);
for(int i = n; i >= 1; i--){
int idx = Query(1, 1, n, v[i]);
sol[idx] = i;
Update(1, 1, n, idx);
}
for(int i = 1; i <= n; i++){
fout << sol[i] << "\n";
}
return 0;
}