Cod sursa(job #1035073)

Utilizator thewildnathNathan Wildenberg thewildnath Data 18 noiembrie 2013 12:03:00
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
//#include<algorithm>
#include<stdlib.h>
#include<time.h>
using namespace std;

int n,k,v[3000002];

inline void schimb(int &a,int &b)
{
    int aux=a;
    a=b;
    b=aux;
}

int part(int st,int sf)
{
    int i=st-1,j=sf+1,poz=v[st+rand()%(sf-st+1)];

    while(1)
    {
        ++i;
        while(v[i]<poz)
            ++i;
        --j;
        while(v[j]>poz)
            --j;

        if(i<j)
            schimb(v[i],v[j]);
        else
            return j;
    }
    return 0;
}

void rez(int st,int sf,int k)
{
    if(st==sf)
        return;
    int s=part(st,sf),t=s-st+1;

    if(t>=k)
        rez(st,s,k);
    else
        rez(s+1,sf,k-t);
}

int main()
{
    freopen("sdo.in","r",stdin);
    freopen("sdo.out","w",stdout);
    int i;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);

    srand(time(NULL));

    rez(1,n,k);

    //nth_element(v+1,v+k,v+1+n);
    printf("%d\n",v[k]);

    return 0;
}