Cod sursa(job #1972077)

Utilizator GeorginskyGeorge Georginsky Data 21 aprilie 2017 19:11:31
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#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;
}