Cod sursa(job #1242948)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 15 octombrie 2014 12:03:48
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <cstdlib>

using namespace std;


#define fileIn  "sdo.in"
#define fileOut "sdo.out"

#define maxN 3000100

int v[maxN];

int random( int lo, int hi )
{
    return rand() % ( hi - lo + 1 ) + lo;
}

int getPivot( int lo, int hi )
{
    int t;
    int index = random( lo, hi );
    int pivot;

    t = v[index];
    v[index] = v[hi];
    v[hi] = t;
    pivot = t;

    index = lo;

    for ( int i = lo; i < hi; ++i )
    {
        if ( v[i] < pivot )
        {
            if ( i != index )
            {
                t = v[i];
                v[i] = v[index];
                v[index++] = t;
            }
            else
                ++index;
        }
    }

    v[hi] = v[index];
    v[index] = pivot;

    return index;
}

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 ( k < localSorted )
        return quickSelect( lo, sorted - 1, k );

    if ( k > localSorted )
        return quickSelect( sorted + 1, hi, k - localSorted );

    return v[sorted];
}

int main()
{
    srand( 1233 * 11 / 6 + 123 );

    ifstream sIn( fileIn );
    ofstream sOut( fileOut );

    int n, k, i;

    sIn >> n >> k;

    for ( i = 1; i <= n; ++i )
        sIn >> v[i];

    sOut << quickSelect( 1, n, k ) << '\n';

    return 0;
}