Cod sursa(job #396089)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 14 februarie 2010 14:56:19
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define NMAX 3000002
int n,k,A[NMAX];
void read()
{
	scanf("%d%d",&n,&k);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
}
int part(int A[NMAX],int st,int dr)
{
	int i=st-1,j=dr+1,p=A[st+(rand()%(dr-st+1))],t;
	while (1)
	{
		do
		{
			++i;
		}
		while (A[i]<p);
		do
		{
			--j;
		}
		while (A[j]>p);
		if (i<j)
			t=A[i],A[i]=A[j],A[j]=t;
		else
			return j;
	}
}
void select(int A[NMAX],int st,int dr,int k)
{
	if (st==dr)
		return ;
	int x=part(A,st,dr);
	int act=x-st+1;
	if (act>=k)
		select(A,st,x,k);
	else
		select(A,x+1,dr,k-act);
}
int main()
{
	freopen("sdo.in","r",stdin);
	freopen("sdo.out","w",stdout);
	read();
	srand(time(NULL));
	select(A,1,n,k);
	printf("%d\n",A[k]);
	return 0;
}