Cod sursa(job #2663076)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 25 octombrie 2020 11:52:12
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

string name = "schi";
ifstream fin(name + ".in");
ofstream fout(name + ".out");

int n, m;
vector<int> v;
vector<int> aib;
vector<int> sol;

void init() {
    v = vector<int>(n + 1);
    aib = vector<int>(n + 1);
    sol = vector<int>(n + 1);
}

int lsb(int val) {
    return val & (-val);
}

void update(int pos, int val) {
    for (int idx = pos; idx <= n; idx += lsb(idx)) {
        aib[idx] += val;
    }
}

int query(int pos) {
    /// suma de la 1 la pos
    int sum = 0;
    for (int idx = pos; idx > 0; idx -= lsb(idx)) {
        sum += aib[idx];
    }
    return sum;
}

void read() {
    fin >> n;
    init();

    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }

    for (int i = 1; i <= n; ++i) {
        update(i, 1);
    }
}

int searchRealPosition(int pos) {
    int left = 1, right = n;
    int mid;
    while (left <= right) {
        mid = (left + right) / 2;
        if (pos <= query(mid)) {
            right = mid - 1;
        }
        else {
            left = mid + 1;
        }
    }
    return left;
}

void solve() {
    for (int i = n; i >= 1; --i) {
        int realPosition = searchRealPosition(v[i]);
        sol[realPosition] = i;
        update(realPosition, -1);
    }
}

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

int main()
{
    read();
    solve();
    print();
    return 0;
}