Cod sursa(job #425611)

Utilizator ooctavTuchila Octavian ooctav Data 25 martie 2010 21:42:41
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
/*#include <cstdio>
#include <istream>
#include <algorithm>
using namespace std;
#define NMAX 3000005
int N, K;
int V[NMAX];

void citire()
{
	scanf("%d%d",&N,&K);
	for(int i = 1 ; i <= N ; i++)
		scanf("%d",&V[i]);
}

int main()
{
	freopen("sdo.in","r",stdin);
	freopen("sdo.out","w",stdout);
	citire();
	sort(V + 1, V + N);
	printf("%d",V[K]);
	return 0;
}*/

#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

#define MAX_N 3000005

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

int A[MAX_N], N, K;

void citire()
{
	fin >> N >> K;

	for(int i = 1; i <= N; ++i)
		fin >> A[i];
}

int part(int A[MAX_N], int st, int dr)
{
	int i = st, j = dr, p = A[st];

	while(1)
	{
		while(A[i] < p)
			i++;
		while(p < A[j])
			j--;
		
		if(i < j)
			swap(A[i], A[j]);
		else 
			return j;
	}

	return 0;
}

void sel(int A[MAX_N], int st, int dr, int k)
{
	if(st == dr)
		return;

	int q = part(A, st, dr);
	int t = q - st + 1;

	if(t >= k)
		sel(A, st, q, k);
	else
		sel(A, q + 1, dr, k - t);
}

int main()
{
	citire();
	sel(A, 1, N, K);

	fout << A[K] << "\n";
}