Cod sursa(job #689788)

Utilizator mika17Mihai Alex Ionescu mika17 Data 24 februarie 2012 20:38:36
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#include <vector>
#include <cstdlib>
using std::vector;

inline void swap(int &a,int &b)
{
	int aux = a; a = b; b = aux;
}
int nth_element(vector<int> &v,int le,int ri,int K)
{
	if(ri - le > 0)
	{
		int p = v[le + rand() % (ri - le + 1)];
		int i = le,j = ri;

		do
		{
			while(v[i] < p) ++i;
			while(v[j] > p) --j;

			if(i < j)
			{
				swap(v[i++],v[j--]);
			}
			else if(i == j) rand() % 2 == 0 ? --j : ++i;
		}
		while(i <= j);
		if(K <= j - le + 1) return nth_element(v,le,j,K);
		else return nth_element(v,i,ri,K - (j - le + 1));
	}
	else return v[le]; //v[ri]
}
int main()
{
	std::ifstream in("sdo.in");
	std::ofstream out("sdo.out");
	int N,K;
	in >> N >> K;
	vector<int> v(N);
	for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
		in >> *i;
	out << nth_element(v,0,N - 1,K);
	return 0;
}