Cod sursa(job #2284927)

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

namespace Pheap {
	int val[1000010], next[1000010], fiu[1000010];
	int cnt = 0;

	inline int add(int x) {
		val[++cnt] = x;
		return cnt;
	}

	inline 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;
	}

	inline 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;

}