Cod sursa(job #394068)

Utilizator alexandru92alexandru alexandru92 Data 10 februarie 2010 14:37:24
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on February 9, 2010, 7:25 PM
 */
#include <fstream>
#include <iterator>
#define Nmax 3000001

/*
 *
 */
using namespace std;
int v[Nmax];
inline void swap( int x, int y )
{
    v[x]+=v[y];
    v[y]=v[x]-v[y];
    v[x]-=v[y];
}
inline int medianof3( int a, int b, int c )
{
    if( a > b )
        swap( a, b );
    if( a > c )
        swap( a, c );
    if( b > c )
        swap( b, c );
    swap( b, c-1 );
    return v[c-1];
}
inline int Partition( int left, int right, int pValue )
{
    int leftPtr=left, rightPtr=right;
    while( true )
    {
        while( v[++leftPtr] > pValue );
        while( v[--rightPtr] < pValue );
        if( leftPtr >= rightPtr )
            break;
        swap( leftPtr, rightPtr );
    }
    swap( left, right-1 );
    return leftPtr;
}
inline int Select( int left, int right, int i )
{
    if( left == right )
        return v[left];
    int middle=left+(right-left)/2;
    int q=Partition( left, right, medianof3( left, middle-1, right-1 ) );
    int k=q-left+1;
    if( i == k )
        return v[q];
    if( i < k )
        return Select( left, q-1, i );
    else return Select( q+1, right, i-k );
}
int main( void )
{
    int n, k;
    ifstream in("sdo.in");
    in>>n>>k;
    copy( istream_iterator<int>(in), istream_iterator<int>(), v );
    ofstream out("sdo.out");
    out<<Select( 0, n, k );
    return 0;
}