Cod sursa(job #854278)

Utilizator cdascaluDascalu Cristian cdascalu Data 13 ianuarie 2013 10:08:20
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#define Nmax 3000001

int v[Nmax],N,K;
void read_data()
{
    FILE*f = fopen("sdo.in","r");
    fscanf(f,"%d%d",&N,&K);
    for(int i=1;i<=N;++i)
        fscanf(f,"%d",&v[i]);
    fclose(f);
}
void swap(int x,int y)
{
    int aux = v[x];
    v[x] = v[y];
    v[y] = aux;
}
int get_piv(int left,int right)
{
    int piv = (left+right)/2;
    swap(piv, right);
    piv = right;
    --left;
    while(true)
    {
        while(v[++left] < v[piv] && left<right);
        while(v[--right] > v[piv] && left<right);

        if(left >= right)
            break;
        swap(left, right);
    }
    swap(piv, left);
    return left;
}
int sdo(int left,int right)
{
    if(left == right)
        return v[left];
    int piv = get_piv(left,right);
    if(piv - left >= K)//nr de elem intre left, piv-1
        return sdo(left,piv-1);
    else
        K -= (piv-left);
    if(K==1)//inseamna ca e pivotul
        return v[piv];
    else
        --K;

    return sdo(piv+1,right);
}
int main()
{
    read_data();
    FILE*g = fopen("sdo.out","w");
    fprintf(g,"%d\n",sdo(1,N));
    fclose(g);
    return 0;
}