Pagini recente » Cod sursa (job #2339656) | Monitorul de evaluare | Diferente pentru utilizator/roxy intre reviziile 3 si 2 | Monitorul de evaluare | Cod sursa (job #3357783)
#include <fstream>
using namespace std;
ifstream cin("schi.in");
ofstream cout("schi.out");
const int maxN = 3e4;
int arr[maxN], ans[maxN], aib[maxN];
void actualizare(int n, int poz, int val){
while(poz <= n){
aib[poz] += val;
int p2 = (poz & (-poz));
poz += p2;
}
}
int interogare(int n, int poz){
int s = 0;
while(poz > 0){
s += aib[poz];
int p2 = poz & (-poz);
poz -= p2;
}
return s;
}
int caut_bin(int n, int target){
int st = 0, dr = n, rez = -1;
while(st <= dr){
int mij = (st + dr) / 2;
if(interogare(n, mij) >= target){
rez = mij;
dr = mij - 1;
}else{
st = mij + 1;
}
}
return rez;
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> arr[n - 1 - i];
}
for(int i = 1; i <= n; i++){
actualizare(n, i, 1);
}
for(int i = 0; i < n; i++){
int cb = caut_bin(n, arr[i]);
ans[cb - 1] = n - i;
actualizare(n, cb, -1);
}
for(int i = 0; i < n; i++) cout << ans[i] << '\n';
return 0;
}