Pagini recente » Cod sursa (job #1147275) | Diferente pentru problema/competition intre reviziile 1 si 7 | Cod sursa (job #1121421) | Cod sursa (job #1059793) | Cod sursa (job #3319750)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
const int NMAX=30000;
vector<int> v, ans;
int n;
struct AINT{
int arbore[4*NMAX+5];
void update(int poz, int val, int left=1, int right=n, int node=1){
if(left==right){
arbore[node]=val;
return;
}
int mid=(left+right)/2;
if(poz<=mid){
update(poz, val, left, mid, 2*node);
}else{
update(poz, val, mid+1, right, 2*node+1);
}
arbore[node]=arbore[2*node]+arbore[2*node+1];
}
int query(int val, int left=1, int right=n, int node=1){
if(left==right){
return left;
}
int mid=(left+right)/2;
if(arbore[2*node]>=val){
return query(val, left, mid, 2*node);
}else{
return query(val-arbore[2*node], mid+1, right, 2*node+1);
}
}
};
int main(){
fin>>n;
v.resize(n+1);
ans.resize(n+1);
AINT aint;
for(int i=1;i<=n;i++){
fin>>v[i];
aint.update(i, 1);
}
for(int i=n;i>=1;i--){
int poz=aint.query(v[i]);
aint.update(poz, 0);
ans[poz]=i;
}
for(int i=1;i<=n;i++){
fout<<ans[i]<<'\n';
}
}