Cod sursa(job #479582)

Utilizator SpiderManSimoiu Robert SpiderMan Data 24 august 2010 15:30:42
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
# include <fstream>
using namespace std;

const char FIN[] = "sdo.in", FOU[] = "sdo.out" ;
const int MAX =  3000004 ;

int A[MAX];
int N, K;

int parti ( int * , int , int ) ;
void sdo ( int * , int , int , int ) ;

void read_data ( void ) {
    ifstream f ( FIN ) ;
    f >> N >> K ;

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


int main ( void )
{
	read_data () ;

	sdo ( A, 1, N, K ) ;

	ofstream g ( FOU ) ;
	g << A[K] ;
}

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

	while ( true ) {
		for ( ++i ; A[i] < piv; ++i ) ;
		for ( --j ; A[j] > piv; --j ) ;

		if ( i < j ) {
		    swap ( A[i], A[j] ) ;
		} else {
		    return j ;
		}
	}

	return 0 ;
}

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

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

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