Cod sursa(job #3365579)

Utilizator irina_opreaIrina Oprea irina_oprea Data 22 septembrie 2026 17:19:55
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 3e5+10;

bool gtfo;
int v[NMAX], aint[NMAX], sum=0, n, ans[NMAX], locliber=0;

void build(int, int, int, int);
void update(int, int, int, int);
void caut_liber(int, int, int, int);

int main()
{
    ifstream cin ("schii.in");
    ofstream cout ("schii.out");

    int n, loc=0;
    cin >> n;
    for (int i=1; i<=n; i++)
    {
        cin >> v[i];
        build(1, 1, n, i);
    }
    for (int i=n; i>0; i--)
    {
        loc = v[i];
        gtfo = false;
        locliber = 0;
        sum = 0;
        caut_liber(1, 1, n, loc);
        ans[locliber] = i;
        update(1, 1, n, locliber);
        /*
        for (int j=1; j<=n; j++)
        {
            cout << ans[j] << " ";
        }
        cout << '\n';
        for (int j=8; j<=15; j++)
        {
            cout << aint[j] << " ";
        }
        cout << '\n' << '\n';
        */
    }
    for (int i=1; i<=n; i++)
    {
        cout << ans[i] << '\n';
    }
    return 0;
}

void update(int nod, int st, int dr, int poz)
{
    if (st == dr)
    {
        aint[nod] = 0;
        return;
    }
    int mid = (st+dr)/2;
    if (poz <= mid)
    {
        update(2*nod, st, mid, poz);
    }
    else if (poz > mid)
    {
        update(2*nod+1, mid+1, dr, poz);
    }
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

void caut_liber(int nod, int st, int dr, int val)
{
    if (gtfo) return;
    if ((aint[nod] < val-sum) || ((aint[nod] <= val-sum) && (sum != 0)) || ((aint[nod] == val) && (val == 1)))
    {
        sum += aint[nod];
        if ((sum == val) && (st == dr))
        {
            locliber = dr;
            gtfo = true;
        }
        else if (sum == val)
        {
            sum -= aint[nod];
        }
        else return;
    }
    int mid = (st+dr)/2;
    caut_liber(2*nod, st, mid, val);
    if (gtfo) return;
    caut_liber(2*nod+1, mid+1, dr, val);
    return;
}

void build(int nod, int st, int dr, int poz)
{
    if (st == dr)
    {
        aint[nod] = 1;
        return;
    }
    int mid = (st+dr)/2;
    if (poz <= mid)
    {
        build(2*nod, st, mid, poz);
    }
    else if (poz > mid)
    {
        build(2*nod+1, mid+1, dr, poz);
    }
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}