Cod sursa(job #1018618)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 29 octombrie 2013 20:15:08
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <cassert>
#include <cstdlib>
#include <ctime>
 
#define MAX_N 3000000
 
int n, k, v[MAX_N];
 
void read( FILE *fin ) {
    assert( fscanf( fin, "%d%d", &n, &k ) == 2 );
    for ( int i = 0; i < n; ++i )
        assert( fscanf( fin, "%d", &v[i] ) == 1 );
}
 
void swap( int &a, int &b ) {
    int aux = a;
    a = b;
    b = aux;
}
 
void qsort( int left, int right ) {
    if ( left >= right )
        return;
 
    int piv = v[left + rand() % ( right - left + 1 )], begin = left, end = right;
 
    while ( begin <= end ) {
        while ( v[begin] < piv )
            ++begin;
        while ( v[end] > piv )
            --end;
 
        if ( begin <= end ) {
            swap( v[begin], v[end] );
            ++begin;
            --end;
        }
    }
 
    if ( k <= end )
        qsort( left, end );
    else
        qsort( begin, right );
}
 
int main() {
    srand( time( NULL ) );
 
    FILE *fin, *fout;
 
    fin = fopen( "sdo.in", "r" );
    read( fin );
    fclose( fin );
 
    --k;
    qsort( 0, n - 1 );
 
    fout = fopen( "sdo.out", "w" );
    fprintf( fout, "%d", v[k] );
    fclose( fout );
}