Cod sursa(job #3367830)

Utilizator CalinPaun29Paun Calin CalinPaun29 Data 11 octombrie 2026 11:18:29
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int nm=30005;

int aint[4*nm], v[nm], rez[nm];

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

int query(int nod, int st, int dr, int x, int y)
{
    if(x<=st && dr<=y)
        return aint[nod];
    int mid=(st+dr)/2, l=0, r=0;
    if(x<=mid)
        l=query(2*nod, st, mid, x, y);

    if(y>=mid+1)
        r=query(2*nod+1, mid+1, dr, x, y);
    return l+r;
}

int cb(int nod, int st, int dr, int val)
{
    if(st==dr)
        return st;
    int mid=(st+dr)/2;
    if(aint[2*nod]<val)
        return cb(2*nod+1, mid+1, dr, val-aint[2*nod]);
    else
        return cb(2*nod, st, mid, val);
}

signed main()
{
    ifstream cin("schi.in");
    ofstream cout("schi.out");
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>v[i];
        update(1, 1, n, i, 1);
    }
    for(int i=n; i>0; i--)
    {
        int poz=cb(1, 1, n, v[i]);
        rez[poz]=i;
        update(1, 1, n, poz, -1);
    }
    for(int i=1; i<=n; i++)
        cout<<rez[i]<<'\n';
    return 0;
}