Cod sursa(job #2108188)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 17 ianuarie 2018 23:20:57
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

const int NMax = 30010;

inline void debug()
{
	#ifndef ONLINE_JUDGE
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	freopen("schi.in", "r", stdin);
	freopen("schi.out", "w", stdout);
	#endif
}

int v[NMax], arbInt[4 * NMax], solutie[NMax];

void buildTree(int node, int left, int right, int poz) {
	if(left == right) {
		arbInt[node] = 1;
		return;
	}

	int mid = (left + right) >> 1;

	if(poz <= mid)
		buildTree(2 * node, left, mid, poz);
	else
		buildTree(2 * node + 1, mid + 1, right, poz);

	arbInt[node] = arbInt[2 * node] + arbInt[2 * node + 1];
}

void find(int node, int left, int right, int poz, int current) {
	if(left == right) {
		arbInt[node] = 0;
		solutie[left] = current;
		return;
	}

	int mid = (left + right) >> 1;

	if(poz <= arbInt[2 * node])
		find(2 * node, left, mid, poz, current);
	else
		find(2 * node + 1, mid + 1, right, poz - arbInt[2 * node], current);

	arbInt[node] = arbInt[2 * node] + arbInt[2 * node + 1];
}

int main()
{
	debug();
    
    int n;
    cin >> n;

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

    for(int i = n; i > 0; --i)
    	find(1, 1, n, v[i], i);

    for(int i = 1; i <= n; ++i)
    	cout << solutie[i] << '\n';
	
    return 0;
}