Pagini recente » Cod sursa (job #890909) | Monitorul de evaluare | Cod sursa (job #2018593) | Diferente pentru problema/subsecvente intre reviziile 2 si 3 | Cod sursa (job #3357076)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream in("schi.in");
ofstream out("schi.out");
vector <int> aint;
int pow_2(int n) {
int p = 1;
while (p <= n) {
p *= 2;
}
return p * 2;
}
int interogare_act(int p, int st, int dr, int poz) {
if (st == dr) {
aint[p] = 1;
return st;
}
int m = (st + dr) / 2, fs = 2 * p, fd = 2 * p + 1;
int poz_libere_st = m - st + 1 - aint[fs], rez;
if (poz <= poz_libere_st) {
rez = interogare_act(fs, st, m, poz);
} else {
rez = interogare_act(fd, m + 1, dr, poz - poz_libere_st);
}
aint[p] = aint[fs] + aint[fd];
return rez;
}
int main() {
int n;
in >> n;
vector <int> clasament_inter(n + 1);
for (int i = 1; i <= n; i++) {
in >> clasament_inter[i];
}
in.close();
vector <int> clasament_final(n + 1);
aint.resize(pow_2(n), 0);
for (int i = n; i >= 1; i--) {
int poz = interogare_act(1, 1, n, clasament_inter[i]);
clasament_final[poz] = i;
}
for (auto c : vector(clasament_final.begin() + 1, clasament_final.end())) {
out << c << "\n";
}
out.close();
return 0;
}