Cod sursa(job #3362969)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 11:27:43
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
#define MAXN 30000

using namespace std;

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

int v[MAXN + 1], aint[4 * MAXN], loc[MAXN + 1];

int trans(int n){
    int rez;

    rez = 1;
    while(rez < n){
        rez *= 2;
    }
    return rez;
}

void build(int nod, int st, int dr){
    int mij;
    if(st == dr){
        aint[nod] = 1;
    }else{
        mij = (st + dr) / 2;
        build(2 * nod, st, mij);
        build(2 * nod + 1, mij + 1, dr);
        aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
    }
}
void update(int nod, int st, int dr, int poz, int val){
    int mij;

    if(st == dr){
        aint[nod] = val;
    }else{
        int mij;
        mij = (st + dr) / 2;

        if(poz <= mij){
            update(2 * nod, st, mij, poz, val);
        }else{
            update(2 * nod + 1, mij + 1, dr, poz, val);
        }
        aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
    }
}
int query(int nod, int st, int dr, int val){
    int mij;

//    printf("st = %d, dr = %d, a = %d, l = %d, r = %d, val = %d\n", st, dr, aint[nod], aint[2 * nod], aint[2 * nod + 1], val);
    if(st == dr){
        return st;
    }
    mij = (st + dr) / 2;
    if(aint[2 * nod] >= val){
        return query(2 * nod, st, mij, val);
    }
    val -= aint[2 * nod];
    return query(2 * nod + 1, mij + 1, dr, val);
}

int main()
{
    int n, n2, i, st, dr, mij, q;

    fin >> n;

    n2 = trans(n);

    for(i = 1; i <= n; i++){
        fin >> v[i];
    }
    build(1, 1, n);
//    printf("q = %d\n", query(1, 1, n, 1, 2));
    for(i = n; i >= 1; i--){
        q = query(1, 1, n, v[i]);
//        printf("aint = %d, i = %d, q = %d, cat = %d\n", aint[1], i, q, v[i]);
        loc[q] = i;
        update(1, 1, n, q, 0);
    }
    for(i = 1; i <= n; i++){
        fout << loc[i] << "\n";
    }
    return 0;
}