Cod sursa(job #396090)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 14 februarie 2010 14:58:54
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>
#include <fstream>
#include <time.h>
#include <stdlib.h>
#define NMAX 3000002
using namespace std;
int n,k,A[NMAX];
ifstream in ("sdo.in");
ofstream out ("sdo.out");
void read()
{
	in>>n>>k;
	int i;
	for (i=1; i<=n; i++)
		in>>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))];
	while (1)
	{
		do
		{
			++i;
		}
		while (A[i]<p);
		do
		{
			--j;
		}
		while (A[j]>p);
		if (i<j)
			swap(A[i],A[j]);
		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()
{
	read();
	srand(time(NULL));
	select(A,1,n,k);
	out<<A[k]<<'\n';
	return 0;
}