Cod sursa(job #1824900)

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

using namespace std;

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

int pos = 0;
char buff[BUFF_SIZE];
void Read(int &a)
{
	while (!isdigit(buff[pos]))
		if (++pos == BUFF_SIZE)
			in.read(buff, BUFF_SIZE), pos = 0;
	a = 0;
	while (isdigit(buff[pos]))
	{
		a = a * 10 + (buff[pos] - '0');
		if (++pos == BUFF_SIZE)
			in.read(buff, BUFF_SIZE), pos = 0;
	}
}

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;
	Read(n);
	int x;
	for (int i = 1; i <= n; i++)
	{
		Read(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;
}