Cod sursa(job #1121175)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 25 februarie 2014 11:53:13
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>

using namespace std;

#define MaxN 3000050

int v[MaxN];

int getpivot( int lo, int hi )
{
    int i, indexpivot = lo + ( hi - lo ) / 2;

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

    indexpivot = lo;

    for ( i = lo; i < hi; ++i )
    {
        if ( v[i] < v[hi] )
        {
            if ( i != indexpivot )
            {
                dummy = v[i];
                v[i] = v[indexpivot];
                v[indexpivot++] = dummy;
            }
            else
                ++indexpivot;
        }
    }

    dummy = v[hi];
    v[hi] = v[indexpivot];
    v[indexpivot] = dummy;

    return indexpivot;
}

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()
{
    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;
}