Cod sursa(job #470891)

Utilizator TabaraTabara Mihai Tabara Data 15 iulie 2010 21:32:43
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <ctime>
#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) );
	ifstream fin ( in );
	ofstream fout ( out );

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

	Ret(  1, N, K );
	fout << A[K] << "\n";

	fin.close();
	fout.close();

	return 0;
}