Cod sursa(job #573017)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 5 aprilie 2011 20:05:32
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

const int nmax = 3000010;
int N, A[nmax], K;

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

    scanf("%d %d", &N, &K);
    int i;
    for(i = 1; i <= N; i++)
        scanf("%d", &A[i]);
}

int part(int S, int D)
{
    int p = A[rand() % (D - S + 1) + S];

    int i = S - 1, j = D + 1;
    while(true)
    {
        do{
            ++i;
        }while(A[i] < p);

        do{
            j--;
        }while(A[j] > p);

        if(i < j)
            swap(A[i], A[j]);
        else return j;
    }
    return j;
}


void sel(int S, int D, int k)
{
    if(S == D)
        return;

    int q = part(S, D);
    int R = q - S + 1;

    if(R >= k)
        sel(S, q, k);
    else sel(q + 1, D, k - R);
}

int main()
{
    srand ( time (NULL) );
    read();
    sel(1, N, K);
    printf("%d\n", A[K]);
    return 0;
}