Cod sursa(job #3333917)

Utilizator mariusharabariMarius Harabari mariusharabari Data 15 ianuarie 2026 16:10:12
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;

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

const int AMAX = 12e4+1, NMAX = 3e4+1;

int aint[AMAX], a[NMAX], rez[NMAX];
int n, l;

void constructie(int nod, int l, int r){
    //cout<<nod<<' '<<l<<' '<<r<<endl;
    if(l==r){
        aint[nod]=1;
    }
    else{
        int m=(l+r)/2;
        constructie(2*nod, l, m);
        constructie(2*nod+1, m+1, r);
        aint[nod]=aint[2*nod]+aint[2*nod+1];
    }
}

int cautare(int nod, int l, int r, int val){
    //cout<<nod<<' '<<l<<' '<<r<<' '<<val<<endl;
    if(l==r){
        return l;
    }
    else{
        int m=(l+r)/2;
        if(aint[2*nod]>=val)
            return cautare(2*nod, l, m, val);
        else
            return cautare(2*nod+1, m+1, r, val-aint[2*nod]);
    }
}

void update(int nod, int l, int r, int pos){
    if(l==r)
        aint[nod]=0;
    else{
        int m=(l+r)/2;

        if(m>=pos)
            update(2*nod, l, m, pos);
        else
            update(2*nod+1, m+1, r, pos);

        aint[nod]=aint[2*nod]+aint[2*nod+1];
    }
}

int main(){
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];

    constructie(1, 1, n);
    //cout<<1<<endl;
    for(int i=n;i>0;i--){
        //cout<<i<<endl;
        int pos = cautare(1, 1, n, a[i]);
        update(1, 1, n, pos);
        rez[pos]=i;
    }
    for(int i=1;i<=n;i++)
        fout<<rez[i]<<'\n';

    return 0;
}