Cod sursa(job #658890)

Utilizator irene_mFMI Irina Iancu irene_m Data 9 ianuarie 2012 19:18:18
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

using namespace std;

const int MAX_N = 3000002;
const char infile[] = "sdo.in";
const char outfile[] = "sdo.out";

int a[ MAX_N ];
int N, K;

void read(){
	FILE *f;
	f = fopen( infile, "rt" );
	fscanf( f, "%d %d", &N, &K );
	for( int i = 1; i <= N; ++i )
		fscanf( f, "%d", &a[ i ] );
}

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 ], 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 );
}

void write(){
	FILE *g;
	g = fopen( outfile, "wt" );
	fprintf( g, "%d\n", a[ K ] );
}

int main(){
	read();
	quick( 1, N, K );
	write();
	return 0;
}