Cod sursa(job #3318351)

Utilizator calin06calin mihaescu calin06 Data 28 octombrie 2025 10:09:02
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <numeric>
#include <cstdint>
using namespace std;

// #define debug 1
// #if debug
// ifstream fin("input.txt");
// #else
// #define fin cin
// #endif

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

int n;

void build(int nod, vector<int> &arb, int st, int dr) {
    if (st == dr)
        arb[nod] = 1;
    else {
        int mid = (st + dr) / 2;
        build(2 * nod, arb, st, mid);
        build(2 * nod + 1, arb, mid + 1, dr);
        arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
    }
}

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

}

void query(int nod,vector<int>&arb, int st, int dr, int val,int &sol) {
    if (st == dr)
        sol = st;
    else {
        int mid = (st + dr) / 2;
        if (val <= arb[2 * nod])
            query(2 * nod,arb,st,mid,val,sol);
        else
            query(2 * nod + 1,arb,mid + 1,dr,val - arb[2 * nod],sol);
    }
}

int main() {
    fin >> n;
    vector<int> arb(4 * n + 1, 0);
    build(1, arb, 1, n);

    vector<int>a(n + 1,0);
    vector<int>sol(n + 1,0);

    for (int i = 1;i <= n;i++)
        fin>>a[i];

    for (int i = n;i >= 1;i--) {
        int aux = 0;
        query(1,arb,1,n,a[i],aux);
        update(1,arb,1,n,aux,0);
        sol[aux] = i;
    }

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