Cod sursa(job #1410328)

Utilizator StefanRARapeanu-Andreescu Stefan StefanRA Data 30 martie 2015 23:41:48
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <stdlib.h>
#include <time.h>
int n, i, k, v[3000001];
std::ifstream fin("sdo.in");
std::ofstream fout("sdo.out");
int quick_select(int* input, int p, int r, int k)
{
    int m=p, n=r;
    if (p==r) return input[p];
    int pivot = input[m+rand()%(n-m+1)];
    while ( m < n )
    {
        while ( input[m] < pivot )
            m++;
         
        while ( input[n] > pivot )
            n--;
         
        if ( input[m] == input[n] )
            m++;
        else if ( m < n ) {
            int tmp = input[m];
            input[m] = input[n];
            input[n] = tmp;
        }
    }
    int j=n;
    int length = j - p + 1;
    if ( length == k ) return input[j];
    else if ( k < length ) return quick_select(input, p, j - 1, k);
    else  return quick_select(input, j + 1, r, k - length);
}
int main()
{
    fin>>n>>k;
    for (i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    srand(time(NULL));
    fout<<quick_select(v, 1, n, k);
    return 0;
}