Cod sursa(job #702128)

Utilizator Catah15Catalin Haidau Catah15 Data 1 martie 2012 19:47:06
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>

using namespace std;

#define maxN 3000010

int V[maxN];


void solve (int left, int right, int K)
{
	int piv = (rand() % (right - left + 1)) + left;
	
	swap (V[piv], V[left]);
	int X = V[left];
	
	int st = left, dr = right;
	
	while (st < dr)
	{
		for ( ; st < dr && V[dr] >= X; dr --);
		V[st] = V[dr];
		for ( ; st < dr && V[st] <= X; st ++);
		V[dr] = V[st];
	}
	V[st] = X;
	
	int pospiv = st;
	int le = pospiv - left + 1;
	
	if (le > K) solve (left, pospiv - 1, K);
	else if (le < K) solve (pospiv + 1, right, K - le);
}


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", &V[i]);
	
	srand (time (0));
	
	solve (1, N, K);
	
	printf ("%d", V[K]);
	
	return 0;
}