Cod sursa(job #3362968)

Utilizator CorvinJudge0Corvin Judge CorvinJudge0 Data 13 august 2026 11:25:30
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 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, n2);
//    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, i = %d, a = %d\n", st, dr, mij, n2 + mij - 1);
//            if(aint[n2 + mij - 1] >= v[i]){
////                printf("1");
//                dr = mij;
//            }else{
////                printf("2");
//                st = mij;
//            }
////            printf("st = %d, dr = %d, mij = %d\n", st, dr, mij);
//        }
        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, n2, q, 0);
    }
    for(i = 1; i <= n; i++){
        fout << loc[i] << "\n";
    }
    return 0;
}