Cod sursa(job #1824896)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 8 decembrie 2016 15:42:46
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 500001
#define INF ((1LL << 32) - 1)

using namespace std;

ifstream in("algsort.in");
ofstream out("algsort.out");
unsigned int AINT[4 * NMAX];

void Update(int node, int st, int dr, int poz, unsigned int key)
{
	if (st == dr)
		AINT[node] = key;
	else
	{
		int mid = st + (dr - st) / 2;
		if (poz <= mid)
			Update(2 * node, st, mid, poz, key);
		if (poz > mid)
			Update(2 * node + 1, mid + 1, dr, poz, key);
		AINT[node] = min(AINT[2 * node], AINT[2 * node + 1]);
	}
}

int find(int node, int st, int dr, unsigned int key)
{
	int mid;
	while (st != dr)
	{
		 mid = st + (dr - st) / 2;
		if (AINT[2 * node] == key)
		{
			node = node * 2;
			dr = mid;
		}
		else if (AINT[2 * node + 1] == key)
		{
			node = node * 2 + 1;
			st = mid + 1;
		}
	}
	return st;
}

int main()
{
	int n;
	in >> n;
	int x;
	for (int i = 1; i <= n; i++)
	{
		in >> x;
		Update(1, 1, n, i, x);
	}
	while (AINT[1] != INF)
	{
		out << AINT[1] << " ";
		x = find(1, 1, n, AINT[1]);
		Update(1, 1, n, x, INF);
	}
	in.close();
	out.close();
	return 0;
}