Cod sursa(job #2118949)

Utilizator NashikAndrei Feodorov Nashik Data 31 ianuarie 2018 13:15:24
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>

const int MAX_N = 30000;

int n;
int AIB[1 + MAX_N];

int sum(int k)
{
    int suma = 0;
    while (k > 0)
    {
        suma += AIB[k];
        k &= k - 1;
    }
    return suma;
}

void add(int index, int value)
{
    while (index <= n)
    {
        AIB[index] += value;
        index += index & -index;
    }
}

int kth(int k)
{
    int loc = 0;
    int suma = 0;
    for (int step = 1 << 14; step > 0; step >>= 1)
        if (loc + step <= n && suma + AIB[loc + step] < k)
        {
            suma += AIB[loc + step];
            loc += step;
        }
    loc++;
    return loc;
}
int main()
{
    freopen("schi.in", "r", stdin);
    freopen("schi.out", "w", stdout);
    scanf("%d", &n);
    int Loc[1 + n];
    int Clasament[1 + n];
    for (int i = 1; i <= n; i++)
        scanf("%d", &Loc[i]);
    for (int i = 1; i <= n; i++)
        add(i, 1);
    for (int i = n; i >= 1; i--)
    {
        Loc[i] = kth(Loc[i]);
        Clasament[Loc[i]] = i;
        add(Loc[i], -1);
    }
    for (int i = 1; i <= n; i++)
        printf("%d\n", Clasament[i]);
    return 0;
}