Cod sursa(job #829487)

Utilizator socheoSorodoc Ionut socheo Data 5 decembrie 2012 15:17:05
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>

#define MAXN 3000002

using namespace std;

int a[MAXN], n, k;

int partition(int left, int right)
{
	int q = rand() % (right - left + 1) + left;
	swap(a[q], a[right]);
	int x = a[right];
    int i = left - 1;
	for(int j = left; j <= right - 1; j++)
		if(a[j] < x)
		{
			i++;
			swap(a[i], a[j]);

		}
	swap(a[right], a[i + 1]);
	return i + 1;
}

int p_termen(int l, int r, int p)
{
	if(l == r)
		return a[l];
	int j = partition(l, r);
    int i = j - l + 1;
	if(i == p) 
		return a[j];
	if(p < i)
		return p_termen(l, j - 1, p);
	else
		return p_termen(j + 1, r, p - i);

}

int main()
{
    freopen("sdo.in", "r", stdin);
	freopen("sdo.out", "w", stdout);
	
	scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
    printf("%d", p_termen(1, n, k));

	return 0;
}