Cod sursa(job #2284925)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 17 noiembrie 2018 19:13:54
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
using namespace std;

namespace Pheap {
	vector <int> val = { 0 }, next = { 0 }, fiu = { 0 };

	int add(int x) {
		val.push_back(x);
		next.push_back(0);
		fiu.push_back(0);
		return val.size() - 1;
	}

	int join(int a, int b)
	{
		if (a == 0)
			return b;
		if (b == 0)
			return a;
		if (val[a] > val[b]) {
			next[b] = fiu[a];
			fiu[a] = b;
			return a;
		}
		next[a] = fiu[b];
		fiu[b] = a;
		return b;
	}

	int rem_min(int a)
	{
		int ans = 0, act = 0;
		for (int i = fiu[a]; i; ) {
			int x = i;
			i = next[i];
			next[x] = 0;
			if (act) {
				ans = join(ans, join(act, x));
                act = 0;
			}
			else
				act = x;
		}
		return join(ans, act);
	}
}

int main()
{
    FILE *in = fopen("algsort.in", "r");
    FILE *out = fopen("algsort.out", "w");

	int n, x;
	fscanf(in, "%d", &n);

    int act = 0;

    while (n--) {
        fscanf(in, "%d", &x);
        act = Pheap::join(act, Pheap::add(-x));
    }

    while (act) {
        fprintf(out, "%d ", -Pheap::val[act]);
        act = Pheap::rem_min(act);
    }

	return 0;

}