Cod sursa(job #1933527)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 20 martie 2017 19:43:21
Problema Statistici de ordine Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>

#define maxN 3000003

using namespace std;

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

int n,k,v[maxN];

int getKthElement(int left, int right, int k)
{
    if (left==right) return v[left];
    int i=left, j=right, piv=v[left+rand()&(right-left+1)];
    do {
        while (v[i]<piv) ++i;
        while (v[j]>piv) --j;
        if (i<=j)
        {
            swap(v[i],v[j]);
            ++i;
            --j;
        }
    }while (i<=j);
    if (j-left+1>=k) return getKthElement(left,j,k);
    else return getKthElement(j+1,right,k-j+left-1);
}

int main()
{
    srand(time(NULL));
    fin>>n>>k;
    for (int i=1; i<=n; ++i)
        fin>>v[i];
    fout<<getKthElement(1,n,k);
    return 0;
}