Cod sursa(job #662816)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 16 ianuarie 2012 23:53:16
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <cstdlib>

using namespace std;

const int NMAX = 3000001;

int v[NMAX],less[NMAX],greater[NMAX],nrLess,nrGreater;
int n,k;

int divide(int v[],int p,int u)
{
	int pivot = p + rand()%(u-p+1);
	int valoarePivot = v[pivot];
	nrLess = 0;
	nrGreater = 0;
	for(int i=p;i<=u;i++)
		if(i != pivot)
		{
			if(v[i]<=valoarePivot)
			{
				nrLess++;
				less[nrLess]=v[i];
			}
			else
			{
				nrGreater++;
				greater[nrGreater]=v[i];
			}
		}
	for(int i=1;i<=nrLess;i++)
		v[i]=less[i];
	v[nrLess+1]=valoarePivot;
	for(int i=1;i<=nrGreater;i++)
		v[i]=greater[i];
	return pivot;
}

int nth_element(int v[],int p,int u,int k)
{
	int pivot = divide(v,p,u);
	if(pivot == k)
		return v[pivot];
	else if(pivot < k)
		return nth_element(v,pivot+1,u,k);
	else 
		return nth_element(v,p,pivot-1,k);
}

int main()
{
	freopen("sdo.in","r",stdin);
	freopen("sdo.in","w",stdout);
	
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",&v[i]);
	
	printf("%d\n",nth_element(v,1,n,k));
	return 0;
}