Cod sursa(job #659026)

Utilizator AnaTudorTudor Ana Maria Mihaela AnaTudor Data 9 ianuarie 2012 22:07:59
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 3000002
using namespace std;

int a[ MAX_N ];
int N, K;



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

int partition( int left, int right ){
	int i = left - 1, j = right + 1, val = a[ left + rand() % ( right - left + 1 ) ], sw = 1;
	while( sw ){
		do
			i++;
		while( a[ i ] < val );

		do
			j--;
		while( a[ j ] > val );
		if( i < j )
			swap( i, j );
		else
			return j;
	}
}

void quick( int left, int right, int k ){
	if( left == right )
		return;

	int div = partition( left, right), t = div - left + 1;
	if( t >= k )
		quick( left, div, k );
	else
		quick( div + 1, right, k - t );
}

int main(){
	freopen("sdo.in","r",stdin);
	freopen("sdo.out","w",stdout);
   scanf("%d %d", &N, &K );
	for( int i = 1; i <= N; ++i )
		scanf("%d", &a[ i ] );
    quick( 1, N, K );
    printf("%d\n",a[K]);
return 0;
}