Cod sursa(job #1569669)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 15 ianuarie 2016 20:35:20
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <iostream>
#include <cstdio>
#include <ctime>
#include <algorithm>
#define MAXN 3000100

using namespace std;

int n, k, a[MAXN];

int getRand(int lo, int hi)
{
    return lo + rand()%(hi-lo);
}

void citire()
{
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
    srand(time(NULL));
}

int part(int lo, int hi)
{
	int pivot = a[getRand(lo, hi)];
	for (int i = lo-1, j = hi+1; ; ) {
		while (a[++i] < pivot);
		while (a[--j] > pivot);
		if (i < j)
			swap(a[i], a[j]);
		else
			return j;
	}
}

void solve(int lo, int hi)
{
    if (lo >= hi) return;
    int p = part(lo, hi);
    if (k <= p)
		solve(lo, p);
	else
		solve(p+1, hi);
}


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

    citire();
    solve(1, n);
    printf("%d", a[k]);

    return 0;
}