Cod sursa(job #394078)

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

/*
 *
 */
using namespace std;
vector< int > v;
inline int swap( int& x, int& y )
{
    x+=y;
    y=x-y;
    x-=y;
}
int Partition( int left, int right, int x )
{
    int leftPtr=left, rightPtr=right;
    while( true )
    {
        while( v[++leftPtr] > x );
        while( v[--rightPtr] < x );
        if( leftPtr >= rightPtr )
            break;
        swap( v[leftPtr], v[rightPtr] );
    }
    swap( v[left], v[right-1] );
    return leftPtr;
}
inline int Random_Partition( int left, int right )
{
    int i=left+rand()%(right-left);
    swap( v[right], v[i] );
    return Partition( left, right, v[right-1] );
}
inline int Select( int left, int right, int k )
{
    if( left == right )
        return v[left];
    int q=Random_Partition( left, right );
    int length=q-left+1;
    if( length == k )
        return v[q];
    if( k < length )
        return Select( left, q-1, k );
    else return Select( q+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>(), back_inserter(v) );
    ofstream out("sdo.out");
    out<<Select( 0, n, k );
    return 0;
}