Pagini recente » Istoria paginii runda/oji_bv_1112 | Cod sursa (job #2332050) | Cod sursa (job #3126650) | Cod sursa (job #2157312) | Cod sursa (job #1972077)
#include <iostream>
#include <fstream>
#define N 30005
using namespace std;
ifstream in("schi.in");
ofstream out("schi.out");
int n, tree[4*N], v[N], pos[N];
void init(int l=1, int r=n, int node=1){
if(l==r){
tree[node]=1;
return;
}
int m=(l+r)>>1;
init(l, m, node<<1);
init(m+1, r, (node<<1)|1);
tree[node]=tree[node<<1]+tree[(node<<1)|1];
}
void update(int x, int el, int l=1, int r=n, int node=1){
if(l==r){
tree[node]=x;
return;
}
int m=(l+r)>>1;
if(el<=m)update(x, el, l, m, node<<1);
else update(x, el, m+1, r, (node<<1)|1);
tree[node]=tree[node<<1]+tree[(node<<1)|1];
}
int place(int x, int l=1, int r=n, int node=1){
if(l==r)return l;
int m=(l+r)>>1;
if(x<=tree[node<<1])return place(x, l, m, node<<1);
else return place(x-tree[node<<1], m+1, r, (node<<1)|1);
}
int main(){
in>>n;
for(int i=1; i<=n; i++)in>>v[i];
init();
int p;
for(int i=n; i>=1; i--){
p=place(v[i]);
pos[p]=i;
update(0, p);
}
for(int i=1; i<=n; i++)out<<pos[i]<<"\n";
return 0;
}