Cod sursa(job #407325)

Utilizator TabaraTabara Mihai Tabara Data 2 martie 2010 11:21:01
Problema Statistici de ordine Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <cstdlib>
using namespace std;

const char * in = "sdo.in";
const char * out = "sdo.out";
const int NMAX = 3000005;

int N, K;
int A[NMAX];

int Get ( int st, int dr )
{
	int i, j, pivot;
	i = rand()%(dr-st+1) + st;
	pivot = A[i];

	i = st-1, j = dr+1;
	while ( 1 )
	{
		do { j--; } while ( A[j] > pivot );
		do { i++; } while ( A[i] < pivot );
		if ( i < j )
		{
			A[i] ^= A[j];
			A[j] ^= A[i];
			A[i] ^= A[j];
		}
		else return j;
	}
}

void Ret ( int p, int r, int i )
{
	if ( p == r )
		return;
	int q = Get ( p, r );
	int k = q-p+1;
	if ( i <= k ) 
		Ret ( p, q, i );
	else
		Ret ( q+1,r,i-k );
}

int main ( void )
{
	srand ( time(NULL) );
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d%d", &N, &K );
	int i;
	for ( i = 1; i <= N; scanf ( "%d", A+i++ ) );

	Ret( 1, N, K );
	printf ( "%d\n", *(A+K) );

	return 0;
}