Cod sursa(job #1733079)

Utilizator jurjstyleJurj Andrei jurjstyle Data 23 iulie 2016 16:15:24
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std ;

ifstream f ("sdo.in") ;
ofstream g ("sdo.out") ;

int v[3000003] , n , k ;

int quickSelect ( int st , int dr , int k )
{
  if ( st == dr ) //interval de un singur numar
    return v[st] ;
  int i = st , j = dr ;
  int pivot = v[rand() % (dr - st + 1) + st] ; //alegem un pivot situat inre stanga si dreapta aleator

  while ( i <= j )
    {
     while ( v[i] < pivot )
        ++i ;
     while ( v[j] > pivot )
        --j ;
     if ( i <= j )
        {
         swap ( v[i] , v[j] ) ;
         ++i , --j ;
        }
    }
  if ( k <= ( j - st + 1 ) )
    return quickSelect ( st , j , k ) ;
  else
    return quickSelect ( j + 1, dr , k - ( j - st + 1 ) ) ;
}

int main()
{
  f >> n >> k ;
  for ( int i = 1 ; i <= n ; ++i )
    f >> v[i] ;

  srand(time(0)) ; //alegem aleator

  g << quickSelect ( 1, n , k ) ;
  return 0;
}