Cod sursa(job #2060862)

Utilizator nic_irinaChitu Irina nic_irina Data 8 noiembrie 2017 19:08:27
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

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

int v[3000001];

/*int part ( int s, int d )
{

    int i, j;
        i = s-1;
        j= d+1;
    int randpoz, r1, r2, r3;
    int nr = d-s+1;

    r1 = rand() % nr + s;
    r2 = rand() % nr + s;
    r3 = rand() % nr + s;

    int minr, maxr;
    minr = min ( min(r1, r2), min(r2, r3) );
    maxr = max ( max(r1, r2), max(r2, r3) );

    randpoz = r1+r2+r3 - minr-maxr;

    int pivot = v[randpoz];

    while (true){
        do
        {
            ++i;
        }while( v[i] < pivot);
        do
        {
            --j;
        }while( v[j] > pivot);
        if( i>=j )
            return j;
        swap(v[i], v[j]);
    }
}*/

int part(int p, int r)
{
    int x = v[r];
    int i = p-1;
    for(int j=p; j<r; j++)
        if(v[j] <= x){
            i++;
            swap(v[i], v[j]);
        }
    swap(v[i+1], v[r]);
    return i+1;

}

int rand_part(int p, int r)
{
    int i = rand()% (r-p+1) + p;
    swap (v[r], v[i]);
    return part(p, r);
}

int rand_select(int p, int r, int i)
{
    if ( p == r )
        return v[p];
    int q = rand_part(p, r);
    int k = q - p + 1;
    if ( i == k )
        return v[q];
    else
        if ( i < k )
            return rand_select(p, q-1, i);
        else
            return rand_select(q+1, r, i-k);
}

int main()
{
    int n, k, i;
    fin>>n>>k;
    for(i=1; i<=n; i++)
        fin>>v[i];
    fin.close();

    fout<<rand_select(1, n, k);
    fout.close();
    return 0;
}