Cod sursa(job #3362944)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 10:26:18
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 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 a, int b){
    int mij;

    if(a <= st && dr <= b){
        return aint[nod];
    }
    if(b < st || a > dr){
        return 0;
    }
    mij = (st + dr) / 2;
    if(b <= mij){
        return query(2 * nod, st, mij, a, b);
    }
    if(a >= mij + 1){
        return query(2 * nod + 1, mij + 1, dr, a, b);
    }
    return query(2 * nod, st, mij, a, b) + query(2 * nod + 1, mij + 1, dr, a, b);
}

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

    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--){
        st = 0;
        dr = n;//(st,dr]
        while(dr - st > 1){
            mij = (st + dr) / 2;
//            printf("st = %d, dr = %d, mij = %d\n", st, dr, mij);
            if(query(1, 1, n, 1, mij) >= v[i]){
//                printf("1");
                dr = mij;
            }else{
//                printf("2");
                st = mij;
            }
//            printf("st = %d, dr = %d, mij = %d\n", st, dr, mij);
        }
//        printf("i = %d, dr = %d, cat = %d\n", i, dr, query(1, 1, n, 1, dr));
        loc[dr] = i;
        update(1, 1, n, dr, 0);
    }
    for(i = 1; i <= n; i++){
        fout << loc[i] << "\n";
    }
    return 0;
}