Cod sursa(job #3306886)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 14 august 2025 19:57:18
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 30005;

int n, v[Nmax], aint[4*Nmax], sol[Nmax];
// aint[nod] = cate celule libere sunt in intervalul nod

void Build(int nod, int st, int dr){
    if(st == dr){
        aint[nod] = 1;
        return;
    }
    int mid = (st + dr) / 2;
    Build(2*nod, st, mid);
    Build(2*nod+1, mid+1, dr);
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

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{
        Update(2*nod+1, mid+1, dr, poz);
    }
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

int Query(int nod, int st, int dr, int x){
    if(st == dr){
        return st;
    }
    int mid = (st + dr) / 2;
    if(x <= aint[2*nod]){
        return Query(2*nod, st, mid, x);
    }
    else{
        return Query(2*nod+1, mid+1, dr, x-aint[2*nod]);
    }
}

int main()
{
    ifstream fin("schi.in");
    ofstream fout("schi.out");
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    Build(1, 1, n);
    for(int i = n; i >= 1; i--){
        int idx = Query(1, 1, n, v[i]);
        sol[idx] = i;
        Update(1, 1, n, idx);
    }
    for(int i = 1; i <= n; i++){
        fout << sol[i] << "\n";
    }

    return 0;
}