Cod sursa(job #3369661)

Utilizator AndreiRaresAcatrini Rares Andrei AndreiRares Data 21 octombrie 2026 13:26:47
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#ifdef LOCAL
#define fin cin
#define fout cout
#else
ifstream fin("schi.in");
ofstream fout("schi.out");
#endif

int aint[120000], v[30001], clasament[30001];

void build(int nod, int st, int dr) {
	aint[nod] = dr - st + 1;
	if (st == dr)
		return;
	int mij = (st + dr) / 2;
	build(nod * 2, st, mij);
	build(nod * 2 + 1, mij + 1, dr);
}

void update(int nod, int st, int dr, int poz) {
	if (poz < st || poz > dr)
		return;
	if (st == dr) {
		aint[nod] = 0;
		return;
	}
	int mij = (st + dr) / 2;
	update(nod * 2, st, mij, poz);
	update(nod * 2 + 1, mij + 1, dr, poz);
	aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

int query(int nod, int st, int dr, int s) {
	if (st == dr)
		return st;
	int mij = (st + dr) / 2;
	if (aint[nod * 2] >= s)
		return query(nod * 2, st, mij, s);
	else
		return query(nod * 2 + 1, mij + 1, dr, s - aint[nod * 2]);
}

int main() {
	int n;
	fin >> n;
	for (int i=1; i<=n; i++)
		fin >> v[i];
	build(1, 1, n);
	for (int i=n; i>0; i--) {
		int poz = query(1, 1, n, v[i]);
		clasament[poz] = i;
		update(1, 1, n, poz);
	}
	for (int i=1; i<=n; i++)
		fout << clasament[i] << '\n';
}