Cod sursa(job #3293552)

Utilizator Allie28Radu Alesia Allie28 Data 11 aprilie 2025 22:13:10
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

#define ll long long

using namespace std;

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

const int LMAX = 30005;
const int INF = 0x3f3f3f3f;
const int MOD = 3210121;

int aint[LMAX*4], v[LMAX], clasament[LMAX];

void build(int node, int st, int dr) {
    if (st == dr) {
        aint[node] = 1;
    }
    else {
        int mij = ((st + dr)>>1);
        build(node*2, st, mij);
        build(node*2 + 1, mij + 1, dr);
        aint[node] = aint[node*2] + aint[node*2 + 1];
    }
}

void update(int node, int st, int dr, int pos) {
    if (st == dr) {
        aint[node] = 0;
    }
    else {
        int mij = ((st + dr)>>1);
        if (pos <= mij) update(node*2, st, mij, pos);
        else update(node*2 + 1, mij + 1, dr, pos);
        aint[node] = aint[node*2] + aint[node*2 + 1];
    }
}

int query(int node, int st, int dr, int k) {
    if (st == dr) {
        return st;
    }
    else {
        int mij = ((st + dr)>>1);
        if (aint[node*2] >= k) {
            return query(node*2, st, mij, k);
        }
        else {
            return query(node*2 + 1, mij + 1, dr, k - aint[node*2]);
        }
    }
}

int main() {
    int n, i, pos;
    fin>>n;
    for (i = 1; i <= n; i++) {
        fin>>v[i];
    }
    build(1, 1, n);
    for (i = n; i > 0; i--) {
        pos = query(1, 1, n, v[i]);//al v[i]-lea activ
        clasament[pos] = i;
        update(1, 1, n, pos);//dezactiveaza
    }
    for (i = 1; i <= n; i++) {
        fout<<clasament[i]<<"\n";
    }





    fin.close();
    fout.close();
    return 0;
}