Cod sursa(job #1941211)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 27 martie 2017 02:02:55
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <iostream>
#include <fstream>

#define maxN 3000003

using namespace std;

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

int n,k,v[maxN];

int pivot(int left, int right)
{
    int pos1=left, pos2=right, x=v[(left+right)/2];
    while (pos1<pos2)
    {
        while (pos1<=right && v[pos1]<x) ++pos1;
        while (pos2>=left && v[pos2]>=x) --pos2;
        if (pos1<pos2) swap(v[pos1],v[pos2]);
    }
    for (int i=left; i<=right; ++i)
        if (v[i]==x) return i;
}


void quickSelect(int left, int right, int k)
{
    if (left==right) return;

    int x=pivot(left,right);
    int nr=x-left+1;

    if (nr>=k) quickSelect(left,x,k);
    else quickSelect(x+1,right,k-nr);
}

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