Cod sursa(job #891888)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 februarie 2013 20:58:09
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

#define Nmax 3000002

int N, K;
int v[Nmax];

void citire(){

    freopen("sdo.inn", "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, max = dr, m = v[st + (rand()%(dr-st+1))];

    while(true){

        while(v[min] < m)
            min++;

        while(v[max] > m)
            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;
}