Cod sursa(job #1058069)

Utilizator caen1c a e n caen1 Data 15 decembrie 2013 00:33:35
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>

#define IN "sdo.in"
#define OUT "sdo.out"
#define N 3000000

static long A[N + 1];

long partition(long start, long end)
{
    long i, j, aux, pivot = start + rand() % (end - start + 1);

    aux = A[pivot];
    A[pivot] = A[end];
    A[end] = aux;

    for (i = j = start; i < end; i++)
        if (A[i] <= A[end]) {
            aux = A[i];
            A[i] = A[j];
            A[j] = aux;
            j++;
        }

    aux = A[j];
    A[j] = A[end];
    A[end] = aux;

    return j;
}

long order_statistic(long start, long end, long k)
{
    long q, t;

    if (start <= end) {

        q = partition(start, end);
        t = q - start + 1;

        if (t == k)
            return A[q];
        else if (t < k)
            return order_statistic(q + 1, end, k - t);
        else
            return order_statistic(start, q - 1, k);
    }
}

int main(void)
{
    long i, n, k;

    freopen(IN, "r", stdin);
    freopen(OUT, "w", stdout);

    scanf("%ld %ld", &n, &k);
    for (i = 1; i <= n; i++)
        scanf("%ld", &A[i]);

    printf("%ld\n", order_statistic(1, n, k));

    return 0;
}