Pagini recente » Cod sursa (job #821591) | Cod sursa (job #1702897) | Cod sursa (job #2087632) | Cod sursa (job #3339675) | Cod sursa (job #3334359)
#include<iostream>
#include<stack>
using namespace std;
#define NMAX 30003
int n,aib[NMAX],poz[NMAX];
stack<int>st;
void update(int ind,int val){
// cerr<<"b: "<<val<<" - "<<ind<<endl;
for(;ind<=n;ind+=(ind&-ind)){
aib[ind]+=val;
}
// cerr<<"e: "<<val<<endl;
}
int query(int ind){
int sum=0;
for(;ind>0;ind-=(ind&-ind)){
sum+=aib[ind];
}
return sum;
}
int binsearch(int sum){
int st=1,dr=n,ans=n;
while(st<=dr){
int mij=(st+dr)/2;
int q=query(mij);
// cerr<<" st:"<<st<<" dr:"<<dr<<" q:"<<q<<" mij:"<<mij<<" sum:"<<sum<<endl;
if(sum<=q){
if(q==sum){
ans=mij;
}
dr=mij-1;
}else{
st=mij+1;
}
}
return ans;
}
int main(void){
freopen("schi.in","r",stdin);
freopen("schi.out","w",stdout);
cin>>n;
for(int i=1;i<=n;++i){
int x;
cin>>x;
st.push(x);
update(i,1);
}
int i=n,p;
for(;!st.empty();st.pop()){
int x=st.top();
p=binsearch(x);
poz[p]=i;
update(p,-1);
--i;
}
for(i=1;i<=n;++i){
cout<<poz[i]<<"\n";
}
return 0;
}