Cod sursa(job #2384244)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 20 martie 2019 15:35:24
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <cstdlib>
#include <ctime>

#define input "sdo.in"
#define output "sdo.out"
#define NMAX 3000005

using namespace std;

ifstream in(input);
ofstream out(output);

int arr[NMAX], N, K;

void Swap(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;
}

void Read_Data()
{
	in >> N >> K;
	for (int i = 1; i <= N; i++)
		in >> arr[i];
}

int Partition(int st, int dr)
{
	int pivot = arr[st];
	st--, dr++;
	while (true)
	{
		do
		{
			st++;
		} while (arr[st] < pivot);
		do
		{
			dr--;
		} while (arr[dr] > pivot);
		if (st >= dr) return dr;
		Swap(arr[st], arr[dr]);
	}
}

int Rand_Partition(int st, int dr)
{
	int r_pivot = st + rand() % (dr - st);
	Swap(arr[r_pivot], arr[st]);
	return Partition(st, dr);
}

void Quick_Sort(int st, int dr, int k)
{
	if (st >= dr) return;
	{
		int mid = Rand_Partition(st, dr);
		int toata_smecheria = mid - st + 1;
		if(toata_smecheria >= k)
			Quick_Sort(st, mid, k);
		else
			Quick_Sort(mid + 1, dr, k - toata_smecheria);
	}
}

void Print_Sol()
{
	out << arr[K] << "\n";
}

int main()
{
	srand(time(NULL));
	Read_Data();
	Quick_Sort(1, N, K);
	Print_Sol();
	return 0;
}