Cod sursa(job #818776)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 17 noiembrie 2012 23:16:21
Problema Statistici de ordine Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
#define TRUE 1


int n, k;
int M[300000020];


void swap(int i, int j)
{
	int aux = M[i];
	M[i] = M[j];
	M[j] = aux;
}


int partition(int left, int right)
{
	int i = left - 1, j = right + 1;
	int mid 	= left + (right - left) / 2;
	int mid_el 	= M[mid];

	swap(mid, left);
	++i;

	while (i < j)
	{
		if (M[i] > mid_el)
			swap(i, j--);
		else
			++i;
	}

	if (i > left) --i;
	swap(left, i);
	return i;
}


int select(int k, int left, int right)
{
	int i = partition(left, right);
		
	if (k < i)	return select(k, left, i - 1);
	if (k > i) 	return select(k, i + 1, right);
				return M[i];
}


int main(void)
{	
	int i;
	freopen("sdo.in", "r", stdin);
	freopen("sdo.out", "w", stdout);

	
	scanf("%d %d", &n, &k);
	for (i = 0; i < n; ++i)
		scanf("%d", &M[i]);

	printf("%d\n", select(k-1, 0, n-1));

	return 0;
}