Cod sursa(job #892157)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 februarie 2013 22:35:59
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

#define Nmax 3000002

int N, K;
int v[Nmax];

void citire(){

    freopen("sdo.in", "r", stdin);

    scanf("%d %d", &N, &K);

    for(int i = 1; i <= N; ++i)
        scanf("%d", v + i);

    srand(time(NULL));

    fclose(stdin);
}

void swap(int &a, int &b){

    int c = a;
    a = b;
    b = c;
}

int part(int st, int dr){

    int min = st - 1, max = dr + 1, m = v[st + ( rand()%(dr - st + 1) )];

    while(true){

        do{

            ++min;

        }while(v[min] < m);

        do{

            --max;

        }while(m < v[max]);

        if(min < max)
            swap(v[min], v[max]);
        else
            return max;
    }

    return 0;
}

void sort(int st, int dr, int k){

    if(st == dr)
        return;

    int q = part(st, dr);
    int t = q - st + 1;

    if(t >= k)
        sort(st, q, k);
    else
        sort(q+1, dr, k-t);
}

void afis(){

    freopen("sdo.out", "w", stdout);

    printf("%d\n", v[K]);

    fclose(stdout);
}

int main(){

    citire();
    citire();
    sort(1, N, K);
    afis();

    return 0;
}