Cod sursa(job #1553305)

Utilizator mirupetPetcan Miruna mirupet Data 19 decembrie 2015 16:04:02
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>
#define DIM 3000005
using namespace std;

int part(int, int);
void sel(int, int, int);

int N, K, i;
int v[DIM];

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

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

        sel(1, N, K);
        printf("%d", v[K]);
    }

int part(int left, int right)
{
    int i = left - 1, j = right + 1, p = v[left + (rand()%(right -  left + 1))];
    int aux;

    while (1)
    {
        do
        {
            i++;
        }   while (v[i] < p);

        do
        {
            j--;
        }   while (p < v[j]);

        if (i < j)
        {
            aux = v[i];
            v[i] = v[j];
            v[j] = aux;
        }
        else
            return j;
    }

    return 0;
}

void sel(int left, int right, int k)
{
    if (left == right)
        return;

    int q = part(left, right);
    int t = q - left + 1;

    if (t >= k)
        sel(left, q, k);
    else
        sel(q + 1, right, k - t);
}