Cod sursa(job #1250718)

Utilizator lorundlorund lorund Data 28 octombrie 2014 14:04:05
Problema Schi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#define SIZE 30005

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

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

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

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

int bsearch(int val){
    int st = 1, dr = n, p=n+1;
    while (st <= dr) {
        int mij = st + (dr-st)/2;
        int v = query(mij);
        if (query(mij) == val) {
            p = mij;
            dr = mij - 1;
        } else {
            if (v > val)
                dr = mij - 1;
            else
                st = mij + 1;
        }
    }
    return p;
}

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[pos] = i;
        update(pos);
    }
    for (int i=1; i<=n; ++i){
        printf("%d\n", sol[i]);
    }
    return 0;
}