Cod sursa(job #1863631)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 31 ianuarie 2017 03:03:57
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <algorithm>

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 part(int a[],int p,int q,int x)
{
    int i=p-1;
    for(int j=p;j<q;j++)
        if(a[j]<=x)
        {
            i++;
            swap(a[i],a[j]);
        }
    a[i]=x;
    return i;
}

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)
{
    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);
        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-1,sct-1);
    return 0;
}