Cod sursa(job #394151)

Utilizator alexandru92alexandru alexandru92 Data 10 februarie 2010 17:05:13
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on February 10, 2010, 4:55 PM
 */
#include <ctime>
#include <fstream>
#include <cstdlib>
#include <iterator>
#define Nmax 3000001

/*
 *
 */
using namespace std;
int v[Nmax];
inline void swap( int& x, int& y )
{
    int aux=x;
    x=y;
    y=aux;
}
int Partition( int left, int right )
{
    int x=v[right], i, j;
    for( i=left-1, j=left; j < right; ++j )
    {
        if( v[j] <= x )
        {
            ++i;
            swap( v[j], v[i] );
        }
    }
    swap( v[i+1], v[right] );
    return i+1;
}
inline int RandomP( int left, int right )
{
    int i=left+rand()%(right-left+1);
    swap( v[i], v[right] );
    return Partition( left, right );
}
inline int Select( int left, int right, int k )
{
    if( left == right )
        return v[left];
    int p=RandomP( left, right ), length=p-left+1;
    if( p == k )
        return v[p];
    if( k < length )
        return Select( left, p-1, k  );
    else return Select( p+1, right, k-length );
}
int main( void )
{srand( time(NULL) );
    int n, k;
    ifstream in("sdo.in");
    in>>n>>k;
    copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
    ofstream out("sdo.out");
    out<<Select( 1, n, k );
    return 0;
}