Cod sursa(job #1735377)

Utilizator antanaAntonia Boca antana Data 29 iulie 2016 17:44:06
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include<stdlib.h>
#include<time.h>
#define MAXN 3000000

int n, v[MAXN+1];

inline void swap1(int a, int b)
{
    int aux=v[a];
    v[a]=v[b];
    v[b]=aux;
}
inline int pivotare(int st, int dr)
{
    int i=st, j=dr, pivot=v[st+rand()%(dr-st+1)];
    while(i<=j)
    {
        while(v[i] < pivot) ++i;
        while(v[j] > pivot) --j;
        if(i<=j) swap1(i, j), ++i, --j;
    }
    return i-1;
}
int kelement(int st, int dr, int k)
{
    int q, r;
    if(st==dr)
        return v[st];
    q=pivotare(st, dr);
    r=q-st+1;

    if(r==k) return v[q];
    if(k<r) return kelement(st, q-1, k);
    return kelement(q+1, dr, k-r);
}
int main()
{
    srand(time(0));

    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);

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

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

    printf("%d", kelement(1, n, k));

    return 0;
}