Cod sursa(job #935095)

Utilizator otilia_sOtilia Stretcu otilia_s Data 1 aprilie 2013 15:47:12
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <iostream>
#include <ctime>
#include <algorithm>
#define NMAX 3000005

using namespace std;
int n,k;
int v[NMAX];

void citire()
{
	ifstream fin ("sdo.in");
	fin>>n>>k;
	for (int i=1; i<=n; ++i)
		fin>>v[i];
}

int divide(int st, int dr)
{
	int piv = v[st + (rand()%(dr-st+1))];
	int i = st - 1, j = dr + 1;
	
	while(1)
	{
		do
		{
			++i;
		}
		while (v[i] < piv);
		
		do
		{
			--j;
		}
		while (piv < v[j]);
		
		if (i<j)
			swap(v[i],v[j]);
		else
			return j;
	}
	
	return 0;
}

void part_sort(int st, int dr, int k)
{
	if (st >= dr) 
		return;
	
	int pivot = divide(st,dr);
	int count = pivot - st + 1;
	
	if (count >= k)
		part_sort(st, pivot, k);		
	else
		part_sort(pivot+1,dr, k - count);
}


void afisare()
{
	ofstream fout ("sdo.out");
	fout<<v[k];
}

int main()
{
	citire();
	srand(time(NULL));
	part_sort(1,n,k);	
	afisare();
	return 0;
}