Cod sursa(job #3200129)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 3 februarie 2024 16:35:32
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=3e4+5;
int n,a[dim],aint[4*dim],sol[dim];
void Build(int nod, int st, int dr){
    if(st==dr){
        aint[nod]=1;
    }
    else{
        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;
    }
    else{
        int mid=(st+dr)/2;
        if(poz<=mid){
            Update(2*nod,st,mid,poz);
        }
        if(poz>mid){
            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;
    }
    else{
        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 f("schi.in");
    ofstream g("schi.out");
    f>>n;
    Build(1,1,n);
    for(int i=1;i<=n;i++){
        f>>a[i];
    }
    for(int i=n;i>=1;i--){
        int poz=Query(1,1,n,a[i]);
        sol[poz]=i;
        Update(1,1,n,poz);
    }
    for(int i=1;i<=n;i++){
        g<<sol[i]<<'\n';
    }
    return 0;
}