Cod sursa(job #3154805)

Utilizator stefandutastefandutahoria stefanduta Data 6 octombrie 2023 11:36:27
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#define NMAX 30005

using namespace std;

ifstream in("schi.in");
ofstream out("schi.out");

int v[NMAX];
int aint[2 * NMAX], poz[NMAX];

void build(int node, int nleft, int nright)
{
    if (nleft == nright)
    {
        aint[node] = 1;
        return;
    }

    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);

    build(leftson, nleft, nmid);
    build(rightson, nmid + 1, nright);

    aint[node] = aint[leftson] + aint[rightson];
}

void update(int node, int nleft, int nright, int val, int juc)
{
    if (nleft == nright)
    {
        poz[nleft] = juc;
        aint[node] = 0;
        return;
    }
    int nmid = (nleft + nright) / 2;
    int leftson = node + 1;
    int rightson = node + 2 * (nmid - nleft + 1);

    if (aint[leftson] >= val)
        update(leftson, nleft, nmid, val, juc);
    else
        update(rightson, nmid + 1, nright, val - aint[leftson], juc);

    aint[node] = aint[leftson] + aint[rightson];
}

int main()
{
    int n, i, j;
    in >> n;
    for (i = 1; i <= n; ++i)
        in >> v[i];
    build(1, 1, n);
    for (i = n; i >= 1; --i)
    {
        update(1, 1, n, v[i], i);
    }

    //update(1, 1, n, 3, 8);


    for (i = 1; i <= n; ++i)
        out << poz[i] << "\n";
    return 0;
}