Pagini recente » Cod sursa (job #2219582) | Cod sursa (job #29140) | Cod sursa (job #57537) | Cod sursa (job #907214) | Cod sursa (job #2824389)
#include <stdio.h>
#include <ctype.h>
// hoare quick select
#define MAXN 3'000'000
int v[MAXN];
class ReadOnSteroids {
protected:
static const int BUFSIZE = (128 * 1024);
FILE *fin;
char ibuf[BUFSIZE];
int ibp = BUFSIZE - 1;
bool close;
public:
ReadOnSteroids( char *fname ){
fin = fopen( fname, "r" );
close = true;
}
ReadOnSteroids( FILE *fp ){
fin = fp;
close = false;
}
~ReadOnSteroids(){
if( close )
fclose( fin );
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-result"
inline char getch(){
if( (ibp = ((ibp + 1) & (BUFSIZE - 1))) == 0 )
fread( ibuf, sizeof(char), BUFSIZE, fin );
return ibuf[ibp];
}
#pragma GCC diagnostic pop
template<typename T> inline T getnum(){
T n = 0;
char ch, semn = 1;
while( isspace( ch = getch() ) );
if( ch == '-' ){
ch = getch();
semn = -1;
}
do
n = n * 10 + ch - '0';
while( isdigit( ch = getch() ) );
return n * semn;
}
};
void qselect( int begin, int end, int k ){
int b = begin - 1, e = end + 1, p = v[(begin + end) / 2], aux;
if( begin == end )
return;
while( v[++b] < p );
while( v[--e] > p );
while( b < e ){
aux = v[b];
v[b] = v[e];
v[e] = aux;
while( v[++b] < p );
while( v[--e] > p );
}
//if( begin < e )
// myqsort(begin, e);
//if( e + 1 < end )
// myqsort(e + 1, end);
if( k > e )
qselect( e + 1, end, k );
else
qselect( begin, e, k );
}
int main(){
ReadOnSteroids fin( (char *)"sdo.in" );
FILE *fout = fopen("sdo.out", "w");
int n, k, i;
n = fin.getnum<int>();
k = fin.getnum<int>() - 1;
for( i = 0 ; i < n ; i++ )
v[i] = fin.getnum<int>();
qselect( 0, n - 1, k );
fprintf(fout, "%d\n", v[k]);
fclose(fout);
return 0;
}