Cod sursa(job #1250701)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 28 octombrie 2014 13:49:06
Problema Schi Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#define SIZE 30005

int n, v[SIZE];
int aib[SIZE], sol[SIZE];

void update(int x){
    while (x<=n){
        ++aib[x];
        x += x&(x-1)^x;
    }
}

int query(int x){
    int sum = 0;

    while (x){
        sum += aib[x];
        x -= x&(x-1)^x;
    }
    return sum;
}

int bsearch(int x){
    int li=x+query(x), ls=n;
    int sol = ls;

    while (li<=ls){
        int m=(li+ls)/2;

        if (m-query(m)>=x){
            sol = m;
            ls = m-1;
        }
        else{
            li = m+1;
        }
    }
    return sol;
}

int main()
{
    freopen("schi.in", "r", stdin);
    freopen("schi.out", "w", stdout);

    scanf("%d", &n);
    for (int i=1; i<=n; ++i){
        scanf("%d", &v[i]);
    }
    for (int i=n; i; --i){
        int pos = bsearch(v[i]);
        sol[bsearch(v[i])] = i;
        update(pos);
    }
    for (int i=1; i<=n; ++i){
        printf("%d\n", sol[i]);
    }
    return 0;
}