Cod sursa(job #1308121)

Utilizator claudiu.gatinaFMI Claudiu Gatina claudiu.gatina Data 3 ianuarie 2015 16:51:29
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <algorithm>

using namespace std;

unsigned long int m[300000],stanga[300000],dreapta[30000];
int n,k,ns,nd;

void sdo(int st, int dr, int x)
{
    int i,c=0;
    ns=0;
    nd=0;
    for(i=st;i<=dr;i++)
    {
        if(m[i]<x)
        {
            stanga[ns]=m[i];
            ns++;
        }
        if(m[i]>x)
        {
            dreapta[nd]=m[i];
            nd++;
        }
        if(m[i]==x)
            c++;
    }
    for(i=0;i<ns;i++)
        m[st+i]=stanga[i];
    for(i=ns;i<ns+c;i++)
        m[st+i]=x;
    for(i=ns+c;i<ns+c+nd;i++)
        m[st+i]=dreapta[i-ns-c];

    if(st+ns<=k && k<st+ns+nd)
        return;
    if(st+ns>k)
        sdo(st,st+ns-1,m[(st+st+ns-1)/2]);
    else
        sdo(st+ns+c,dr,m[(st+ns+c+dr)/2]);
}
int main()
{
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
    scanf("%d %d ", &n, &k);
    k--;
    int i;
    for(i=0;i<n;i++)
        scanf("%u ", &m[i]);
    sdo(0,n-1,m[(n-1)/2]);
    printf("%d", m[k]);
    return 0;
}