Cod sursa(job #407303)

Utilizator TabaraTabara Mihai Tabara Data 2 martie 2010 11:08:46
Problema Statistici de ordine Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <stdlib.h>
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;
	}
}

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

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

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

	srand ( time(NULL) );
	printf ( "%d\n", Ret( 1, N, K ) );
	return 0;
}