Cod sursa(job #642525)

Utilizator peanutzAndrei Homorodean peanutz Data 1 decembrie 2011 16:35:30
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <cstdlib>
#define NMAX 3000010

int a[NMAX];

void swap(int &a, int &b)
{
    int aux = a;
    a = b;
    b = aux;
}

int partition(int left, int right, int *a)
{
    int pivotIndex = rand() % (right - left + 1);
    int pivotValue = a[pivotIndex];
    swap(a[right], a[pivotIndex]);
    pivotIndex = left;
    
    for (int i = left; i <= right; i++)
    {
        if (pivotValue > a[i])
        {
            swap(a[i], a[pivotIndex]);
            pivotIndex++;
        }
    }
    swap(a[pivotIndex], a[right]);
    
    return pivotIndex;
}

int getKth(int left, int right, int *a, int k)
{
    if (left == right)
        return a[left];

    int  dist = partition(left, right, a);

    if (dist-left+1 == k)
        return a[dist];
    else if (dist-left+1 > k)
        return getKth(left, dist-1, a, k);
    return getKth(dist+1, right, a, k-(dist-left+1));
}

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

    
    int n, k;
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%d ", &a[i]);
    
    printf("%d", getKth(1, n, a, k));
    return 0;
}