Cod sursa(job #662839)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 17 ianuarie 2012 01:16:31
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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)
				less[++nrLess]=v[i];
			else
				greater[++nrGreater]=v[i];
		}
	int poz = p-1;
	for(int i=1;i<=nrLess;i++)
		v[++poz]=less[i];
	v[++poz]=valoarePivot;
	pivot = poz;
	for(int i=1;i<=nrGreater;i++)
		v[++poz]=greater[i];

	/*for(int i=1;i<=n;i++)
		printf("%d ",v[i]);
	printf("\n");*/
	//printf("%d\n",pivot);
	return pivot;
}

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

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",&v[i]);

	printf("%d\n",nth_element(v,1,n,k));
	/*for(int i=1;i<=n;i++)
		printf("%d ",v[i]);*/
	return 0;
}