Cod sursa(job #1463231)

Utilizator petru.cehanCehan Petru petru.cehan Data 20 iulie 2015 16:32:07
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

ifstream fin ("sdo.in") ;
ofstream fout ("sdo.out") ;

int N , K ;
int a[3000001] ;
void Citire ()
{
    fin >> N >> K ;
    for ( int i = 1 ; i <= N ; ++ i )
                fin >> a[i] ;
}

int partitioneaza ( int a[] , int st , int dr )
{
    int i = st , j = dr ;

    int r = a[ st + rand () % ( dr - st + 1 ) ] ;
    while ( i < j )
    {
        while ( a[i] < r && i < dr )
              ++ i ;
        while ( a[j] > r && j > st )
              -- j ;
        if ( i <= j )
                  swap ( a[i] , a[j] ) , -- i , -- j ;
    }

    return j ;
}

void SDO ( int a[] , int st , int dr , int K )
{
    if ( st == dr )
             return ;
    int q = partitioneaza( a , st , dr ) ;
    int t = q - st + 1 ;

    if ( t >= K )
      SDO ( a , st , q , K ) ;

    else
      SDO ( a , q + 1 , dr , K - t ) ;
}


int main()
{
    srand ( time ( NULL ) ) ;
    Citire () ;
    SDO ( a , 1 , N , K ) ;
    fout << a[K] ;

    return 0;
}