Cod sursa(job #3318270)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 27 octombrie 2025 19:02:42
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAX = 30001;
int n, v[MAX], seg[4 * MAX], sol[MAX];

void build(int node, int st, int dr){
    if(st == dr){
        seg[node] = 1;
    }
    else{
        int m = st + dr >> 1;
        build(node << 1, st, m);
        build(node << 1 | 1, m + 1, dr);
        seg[node] = seg[node << 1] + seg[node << 1 | 1];
    }
}

void update(int node, int st, int dr, int poz){
    if(st == dr){
        seg[node] = 0;
    }
    else{
        int m = st + dr >> 1;

        if(poz <= m)
            update(node << 1, st, m, poz);
        else
            update(node << 1 | 1, m + 1, dr, poz);
        seg[node] = seg[node << 1] + seg[node << 1 | 1];
    }
}

int find_poz(int node, int st, int dr, int sum){
    if(st == dr)
        return st;
    else{
        int m = st + dr >> 1;

        if(sum <= seg[node << 1])
            return find_poz(node << 1, st, m, sum);
        return find_poz(node << 1 | 1, m + 1, dr, sum - seg[node << 1]);
    }
}

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

    for(int i = n; i >= 1; --i){
        int t = find_poz(1, 1, n, v[i]);
        update(1, 1, n, t);
        sol[t] = i;
    }

    for(int i = 1; i <= n; ++i)
        fout << sol[i] << '\n';
}