Cod sursa(job #1114484)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 21 februarie 2014 18:00:56
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

#define n_MAX 3000000

int v[ n_MAX + 1 ];

int qselect( int beg, int end, int k ) {
    if( end - beg > 1 ) {
        int piv = v[ ( beg * 3 + end * 5 ) / 8 ];
        int l = beg - 1, r = end;
        while( l < r ) {
            while( v[ ++ l ] < piv );
            while( v[ -- r ] > piv );
            if( l < r ) {
                int aux = v[ l ];
                v[ l ] = v[ r ];
                v[ r ] = aux;
            }
        }
        if( k < l ) {
            return qselect( beg, l, k );
        } else {
            return qselect( l, end, k );
        }
    } else {
        return v[ beg ];
    }
}

int main( ) {
    FILE * fin, * fout;
    fin = fopen( "sdo.in", "r" );
    fout = fopen( "sdo.out", "w" );

    int n, k;
    fscanf( fin, "%d%d", &n, &k );

    int i;
    for( i = 1; i <= n; i ++ ) {
        fscanf( fin, "%d", v + i );
    }

    fprintf( fout, "%d\n", qselect( 1, n + 1, k ) );

    fclose( fin );
    fclose( fout );
}