Cod sursa(job #1864831)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 1 februarie 2017 00:38:56
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
/// CREDITS TO: Strimbu Alexandru Sagunistu

#include <fstream>
#include <algorithm>

void lol(){
    int x=0;
    x++;
}
using namespace std;

int n,sct,a[3000005],m[3000005];

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

void read()
{
    fin>>n>>sct;
    for(int i=0;i<n;i++)
        fin>>a[i];
}
int e[3000005];
int part(int a[],int p,int q,int x)
{
    int l=p-1,r=q;
    for(int j=p;j<q;j++){
        if(a[j]<x)
            e[++l]=a[j];
        if(a[j]>x)
            e[--r]=a[j];
    }
    for(int i=l+1;i<r;i++)
        e[i]=x;
    for(int i=p;i<q;i++)
        a[i]=e[i];
    return l+1;
}

int find_median(int a[],int p,int q,int pz)
{
    sort(a+p,a+q);
    return a[pz];
}

int select(int a[],int p,int q,int k)
{
    if(p==4)
        lol();
    int s=0,i,r,k1,k2;
    int n = q-p;
    if(q-p<=5)
        return find_median(a,p,q,p+k);
    for(i=0;i<n/5;i++)
    {
        m[i]=find_median(a,5*i,5*(i+1),p+2+5*i);
        s++;
    }
    m[s]=find_median(a,5*i,n,p+(5*i+n)/2);

    r=select(m,0,s+1,(s+1)/2);
    r=part(a,p,q,r);
    k1=r-p;
    if(k==k1)
        return a[k];
    else
    if(k<k1)
        return select(a,p,k1,k);
    else
        return select(a,k1+1,q,k-k1-1);
}

int main()
{
    read();
    //fout<<part(a,0,n,a[0])<<"\n";
    fout<<select(a,0,n,sct-1);
    return 0;
}