Cod sursa(job #3338890)

Utilizator ilie_2008Iamboglo Ilie ilie_2008 Data 5 februarie 2026 13:05:30
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;

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

const int MAXN = 30000;

int N;
int poz[MAXN + 5];
int sol[MAXN + 5];
int arb[4 * MAXN + 5];

void build(int nod, int st, int dr) {
    if (st == dr) {
        arb[nod] = 1;
        return;
    }
    int mid = (st + dr) / 2;
    build(nod * 2, st, mid);
    build(nod * 2 + 1, mid + 1, dr);
    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

int query_k(int nod, int st, int dr, int k) {
    if (st == dr)
        return st;

    int mid = (st + dr) / 2;

    if (arb[nod * 2] >= k)
        return query_k(nod * 2, st, mid, k);
    else
        return query_k(nod * 2 + 1, mid + 1, dr, k - arb[nod * 2]);
}

void update(int nod, int st, int dr, int poz) {
    if (st == dr) {
        arb[nod] = 0;
        return;
    }
    int mid = (st + dr) / 2;
    if (poz <= mid)
        update(nod * 2, st, mid, poz);
    else
        update(nod * 2 + 1, mid + 1, dr, poz);

    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

int main() {
    fin >> N;
    for (int i = 1; i <= N; i++)
        fin >> poz[i];

    build(1, 1, N);

    for (int i = N; i >= 1; i--) {
        int p = query_k(1, 1, N, poz[i]);
        sol[p] = i;
        update(1, 1, N, p);
    }

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

    return 0;
}