Cod sursa(job #1307753)

Utilizator diana-t95FMI Tudoreanu Diana Elena diana-t95 Data 2 ianuarie 2015 19:35:55
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 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)
        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;
}