Cod sursa(job #2777160)

Utilizator justin.stoicaJustin Stoica justin.stoica Data 22 septembrie 2021 12:45:22
Problema Schi Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <algorithm>
using namespace std;
const int NMAX = 30005;
ifstream cin("schi.in");
ofstream cout("schi.out");
int n;
int v[NMAX], aib[NMAX], ans[NMAX];
void update(int poz, int value){
    for(int i = poz; i <= n; i += i & (-i))
        aib[i] += value;
}
int querry(int poz){
    long long sum = 0;
    for(int i = poz; i > 0; i -= i & (-i))
        sum += aib[i];
    return sum;
}
int CautareBinara(int val){
    int sol = n;
    int st = 1, dr = n;
    while(st <= dr){
        int mij = st + dr;
        mij /= 2;
        int curr = querry(mij);
        if(curr <= val){
            sol = mij;
            st = mij + 1;
        }
        else{
            dr = mij - 1;
        }
    }
    return sol;
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> v[i];
        update(i, 1);
    }
    for(int i = n; i >= 1; i --)
    {
        int sol = CautareBinara(v[i]);
        while(querry(sol) == v[i])
            sol--;
        sol++;
        ans[sol] = i;
        update(sol, -1);
    }
    for(int i = 1; i <= n; i ++)
    {
        cout << ans[i] << '\n';
    }
    return 0;
}