Cod sursa(job #935087)

Utilizator otilia_sOtilia Stretcu otilia_s Data 1 aprilie 2013 15:36:02
Problema Statistici de ordine Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 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))];

	do
	{
		while (v[st] < piv)
			++st;
		while (piv < v[dr])
			--dr;
		if (st<=dr)
		{
			swap(v[st],v[dr]);
			++st;
			--dr;
		}
	}
	while (st<dr);
	
	return dr;
}

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;
}