Cod sursa(job #1522361)

Utilizator Esteban_AlexCihodaru Ciprian-Alexandru Esteban_Alex Data 11 noiembrie 2015 16:52:22
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>

using namespace std;

int n,k,a[3000010];

void Citire()
{
    freopen("sdo.in","r",stdin);

    int i;

    scanf("%d%d",&n,&k);

    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
}

void Aux(int &x,int &y)
{
    int aux;
    aux=x;
    x=y;
    y=aux;
}

int Partitionare(int x[],int st, int dr)
{
    int p,piv,i,j;
    p=rand()% (dr-st+1) +st;
    Aux(x[st],x[p]);
    piv=x[st],i=st+1;j=dr;
    while(i<=j)
    {
        if(x[i]<=piv) i++;
        if(x[j]>piv) j--;
        if((i<j) &&(x[i]>piv) && (piv>=x[j]))
        {
            Aux(x[i],x[j]);
            i++;j--;
        }
    }
    x[st]=x[i-1];
    x[i-1]=piv;
    return i-1;
}

int Kthelement(int st,int dr,int k)
{
    int p;
    p=Partitionare(a,st,dr);
    if(p==k) return a[k];
    else if(p<k) return Kthelement(p+1,dr,k);
    return Kthelement(st,p-1,k);
}

int main()
{
    Citire();

    freopen("sdo.out","w",stdout);
    printf("%d",Kthelement(1,n,k));
    return 0;
}