Cod sursa(job #1250392)

Utilizator radudorosRadu Doros radudoros Data 28 octombrie 2014 01:21:30
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
using namespace std;

ifstream fin("sdo.in");
ofstream fout("sdo.out");

int a[3000001];

int partition(int in, int sf)
{
	if (in == sf)
		return in;
	int i = in - 1;
	for (int j = in; j <= sf; j++)
	{
		if (a[j] <= a[sf])
		{
			i++;
			int aux = a[i];
			a[i] = a[j];
			a[j] = aux;
		}
	}
	return i;

}


int kth_element(int n, int m)
{
	int in = 1;
	int sf = n;
	int	k = rand() % (sf - in) + in;
	int aux = a[k];
	a[k] = a[n];
	a[n] = aux;
	k = partition(1, n);
	if (k > m)
	{
		in = 1;
		sf = k - 1;
	}
	else
	{
		in = k + 1;
		sf = n;
	}
	while (sf > in && k != m)
	{
		k = rand() % (sf - in) + in;
		int aux = a[k];
		a[k] = a[sf];
		a[sf] = aux;
		k = partition(in, sf);
		if (k == m)
			return a[k];
		else
		if (k > m)
		{
			sf = k - 1;
		}
		else
		{
			in = k + 1;
		}
	}
	if (k==m)
	return a[k];
	else return a[in];
}



int main()
{
	srand(921241215);
	int n,m;
	fin >> n >>m;
	for (int i = 1; i <= n; i++)
	{
		fin >> a[i];
	}
	fout << kth_element(n,m);

}