Cod sursa(job #3183354)

Utilizator lucar1990Rosu Luca Gabriel Stefan lucar1990 Data 11 decembrie 2023 16:32:08
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;
int n,aint[120001],ans[30001];
int fs(int nod){
    return 2*nod;
}
int fd(int nod){
    return 2*nod + 1;
}
void buildarb(int nod, int st, int dr){
    if(st == dr)
    {
        aint[nod] = 1;
        return ;
    }
    int mij = (st + dr) /2;
    buildarb(fs(nod), st, mij);
    buildarb(fd(nod), mij + 1, dr);
    aint[nod] = aint[fs(nod)] + aint[fd(nod)];
}
vector <int> q;
void cit(){
    cin >> n ;
    for(int i = 1; i <= n; i++)
    {
        int schi;
        cin >> schi;
        q.push_back(schi);
    }
    reverse(q.begin(),q.end());
}
int superquery(int nod, int st,int dr, int x)
{
    if(st == dr) {
        aint[nod] = 0;
        return st;
    }
    int mij = (st + dr)/2;
    int aux;
    if( x <= aint[fs(nod)])
    {
        aux = superquery(fs(nod), st, mij, x);

    }
    else aux = superquery(fd(nod),mij + 1, dr, x - aint[fs(nod)]);
    aint[nod] = aint[fs(nod)] + aint[fd(nod)];
    return aux;
}
void rez(){
    buildarb(1,1,n);
    for(int i = 0; i < q.size(); i++)
    {
       int aux1 = superquery(1,1,n,q[i]);
       ans[aux1] = n - i;
    }
    for(int i = 1; i <= n; i++) cout << ans[i] <<"\n";
}
int main(){
    freopen("schi.in", "r", stdin);
    freopen("schi.out", "w", stdout);
    cit();
    rez();
    return 0;
}