Cod sursa(job #1014219)

Utilizator stanescu.raduRadu Stanescu stanescu.radu Data 22 octombrie 2013 12:56:18
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#include<cstdlib>

using namespace std;
ifstream f ("sdo.in");
ofstream g("sdo.out");
int v[3000005],n,k,i;

int pivot(int st, int dr)
{
	int x1,x2,x3,min,max;
	srand(time(NULL));
	x1=v[st+ rand()%(dr-st+1)];
	x2=v[st+ rand()%(dr-st+1)];
	x3=v[st+ rand()%(dr-st+1)];
	if (x1<=x2 && x1<=x3) min=x1;
	if (x2<=x1 && x2<=x3) min=x2;
	if (x3<=x1 && x3<=x2) min=x3;
	if (x1>=x2 && x1>=x3) max=x1;
	if (x2>=x1 && x2>=x3) max=x2;
	if (x3>=x2 && x3>=x1) max=x3;
	return (x1+x2+x3-max-min);
}

void sdo(int st, int dr)
{
	if( st == dr)
		return ;
	int p=pivot(st,dr);
	int i=st,j=dr;
	if (st<dr)
	{
		while (i<=j)
		{
			while (v[i]<p) i++;
			while (v[j]>p) j--;
			if (i<=j)
			{
				int aux=v[i];
				v[i]=v[j];
				v[j]=aux;
				i++;
				j--;
			}
		}
		if (k<=j) sdo(st,j);
		else sdo(i,dr);
	}
}

int main ()
{
	f>>n>>k;
	for (i=1;i<=n;i++)
		f>>v[i];
	sdo(1,n);
	g<<v[k];
	f.close();
	g.close();
	return 0;
}