Cod sursa(job #971326)

Utilizator cont_de_testeCont Teste cont_de_teste Data 8 iulie 2013 22:08:41
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;

const int NMax = 500100;
const int oo = 0x3f3f3f3f;
int N;

void readVector(vector<int> &, int);
void sortVector(vector<int> &, int, int);
void writeVector(vector<int> &, int);

template <const int _size_>
struct VIM: vector<int> { // Vector IMproved :)
	//------------------------------------------------------------------------------------
	vector<int> norm;
	VIM() {
		(*this).clear();
		norm.resize(_size_, 0);
	}
	//------------------------------------------------------------------------------------
	void readVector(int length) {
		(*this).resize(length + 8, 0);
		for (int i = 1; i <= length; i++) {
			scanf("%i", &(*this).at(i));
		}
	}
	//------------------------------------------------------------------------------------
	void sortVector(int left, int right) {
		if (left == right)
			return ;
		int middle = left + (right - left) / 2;
		sortVector(left, middle);
		sortVector(middle + 1, right);
		
		int p1 = left, p2 = middle + 1;
		
		norm.at(0) = 0;
		while (p1 <= middle || p2 <= right) {
			int value1, value2;
			if (p1 <= middle)
				value1 = (*this).at(p1);
			else value1 = oo;
			if (p2 <= right)
				value2 = (*this).at(p2);
			else value2 = oo;
			if (value1 < value2) {
				norm.at(++norm.at(0)) = value1; p1++;
			} else {
				norm.at(++norm.at(0)) = value2; p2++;
			}
		}
		
		for (int i = left; i <= right; i++)
			(*this).at(i) = norm.at(i - left + 1);
	}
	//------------------------------------------------------------------------------------
	void writeVector(int length) {
		for (size_t i = 1; i <= length; i++)
			printf("%i ", (*this).at(i));
	}
	//------------------------------------------------------------------------------------
};

VIM<NMax> A;

int main() {
	#ifdef INFOARENA
		freopen("algsort.in", "r", stdin);
		freopen("algsort.out", "w", stdout);
	#endif
	scanf("%i", &N);
	A.readVector(N);
	A.sortVector(1, N);
	A.writeVector(N);
}