Cod sursa(job #1034430)

Utilizator morlockRadu Tatomir morlock Data 17 noiembrie 2013 20:24:26
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#define swapp(a, b) a = a ^ b ^ (b = a)
#define nmax 3000005
using namespace std;

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

int N, v[nmax], K;

int part( int v[nmax], int st, int dr )
{
    int i = st - 1;
    int j = dr + 1;
    int p = v[st +  ( rand()%(dr-st+1) ) ];

    while (1)
    {
        do
        {
            ++i;
        } while ( v[i] < p );

        do
        {
            --j;
        } while ( p < v[j] );

        if ( i < j )
           {
               int aux = v[i];
               v[i] = v[j];
               v[j] = aux;
           }
            else
                return j;
    }
    return 0;
}

void sel( int st, int dr, int k )
{
    if ( st == dr )
        return;

    int q = part( v, st, dr );
    int t = q - st + 1;

    if ( t >= k )
        sel(st, q, k);
        else
            sel(q+1, dr, k-t);
}

int main()
{
    in >> N >> K;
    for ( int i=1; i<=N; i++ )
        in >> v[i];

    sel(1, N, K);

    out << v[K];
}