Cod sursa(job #1246520)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 21 octombrie 2014 11:03:42
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstdlib>

using namespace std;

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

#define maxN 3000100

int v[maxN];

int getPivot( int lo, int hi )
{
    int index = lo + ( rand() % ( hi - lo + 1 ) );
    int pivot = v[index];
    int dummy;
    v[index] = v[hi];
    v[hi] = pivot;

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

    return index;
}

int quickSelect( int lo, int hi, int k )
{
    while ( true )
    {
        if ( lo >= hi )
            return v[lo];

        int sorted = getPivot( lo, hi );

        int localSorted = sorted - lo + 1;

        if ( localSorted < k )
        {
            lo = sorted + 1;
            k = k - localSorted;
        }
        else
        {
            if ( localSorted > k )
            {
                hi = sorted - 1;
            }
            else
                return v[sorted];
        }
    }
}

int main()
{
    srand( 312314 * 3 / 2 );

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

    int n, k;

    sIn >> n >> k;

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

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


    return 0;
}