Cod sursa(job #372623)

Utilizator Mishu91Andrei Misarca Mishu91 Data 10 decembrie 2009 22:57:38
Problema Statistici de ordine Scor Ascuns
Compilator cpp Status done
Runda Marime 0.77 kb
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

#define MAX_N 3000005

ifstream fin ("sdo.in");
ofstream fout ("sdo.out");

int A[MAX_N], N, K;

void citire()
{
	fin >> N >> K;

	for(int i = 1; i <= N; ++i)
		fin >> A[i];
}

int part(int A[MAX_N], int li, int lf)
{
	int i = li-1, j = lf+1, p = A[li + (rand()%(lf-li+1))];

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

		do
		{
			--j;
		} while(p < A[j]);
		if(i < j)
			swap(A[i], A[j]);
		else 
			return j;
	}

	return 0;
}

void sel(int A[MAX_N], int li, int lf, int k)
{
	if(li == lf)
		return;

	int q = part(A, li, lf);
	int t = q-li+1;

	if(t >= k)
		sel(A, li, q, k);
	else
		sel(A, q+1, lf, k-t);
}

int main()
{
	srand(time(NULL));
	citire();
	sel(A, 1, N, K);

	fout << A[K] << "\n";
}