Cod sursa(job #1121227)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 25 februarie 2014 12:05:21
Problema Statistici de ordine Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <cstdlib>

using namespace std;

#define MaxN 3000050

int v[MaxN];

int getpivot( int lo, int hi )
{
    int i, k = lo + ( rand() % ( hi - lo ) );
    int pivot = v[k];

    int dummy = v[hi];
    v[hi] = v[k];
    v[k] = dummy;

    k = hi;
    i = lo;

    while ( i < k )
    {
        while ( v[i] < pivot )
            ++i;
        while ( v[k] > pivot )
            --k;

        if ( i < k )
        {
            dummy = v[i];
            v[i] = v[k];
            v[k] = dummy;
        }
        else
            break;
    }

    return k;
}

int quickselect( int lo, int hi, int k )
{
    if ( lo == hi )
        return v[lo];

    int sorted = getpivot( lo, hi );
    int localsorted = sorted - lo + 1;

    if ( localsorted == k )
        return v[sorted];

    if ( localsorted > k )
        return quickselect( lo, sorted - 1, k );
    else
        return quickselect( sorted + 1, hi, k - localsorted );
}

int main()
{
    srand( 71 );

    freopen( "sdo.in", "r", stdin );
    freopen( "sdo.out", "w", stdout );

    int n, i, k;

    scanf( "%d %d\n", &n, &k );

    for ( i = 1; i <= n; ++i )
        scanf( "%d ", &v[i] );

    printf( "%d\n", quickselect( 1, n, k ) );

    return 0;
}