Cod sursa(job #489805)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 3 octombrie 2010 17:04:25
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <fstream>
#include <cstdlib>
#include <ctime>
#define Nmax 3000000+2

using namespace std;

ifstream fin("sdo.in");
ofstream fout("sdo.out");

int A[Nmax];
int N,K,rez;

inline int part(int l,int r){
	int x=A[l+rand()%(r-l)],i=l-1,j=r+1;
	
	while( 1 ){
		do{
			++i;
		}while( A[i] < x );
		do{
			--j;
		}while( x < A[j] );
		if( i< j ) swap(A[i],A[j]);
		else return j;
	}
}

void find(int l,int r,int i){
	if( l == r ){ rez=A[l]; return; }
	
	int m=part(l,r);
	if( i<=m-l+1 ) find(l,m,i);
	else find(m+1,r,i-(m-l+1));
}	

int main(){
	int i;
	srand(time(NULL));
	
	fin>>N>>K;
	for(i=1;i<=N;++i) fin>>A[i];
	
	find(1,N,K);
	
	fout<<rez<<"\n";
	fin.close(); fout.close();
}