Cod sursa(job #3123271)

Utilizator daristyleBejan Darius-Ramon daristyle Data 22 aprilie 2023 19:18:17
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.73 kb
#include <fstream>
#include <random>

using namespace std;

ifstream fin("sdo.in");
ofstream fout("sdo.out");

const int N_MAX = 3e6;
int v[N_MAX];

int QuickSelect(int begin, int end, int k) {
	while(begin < end){
		int b = begin, e = end, pivot = v[begin + rand() % (end - begin)];

		while(v[b] < pivot)
			++b;
		while(v[e] > pivot)
			--e;

		while(b < e){
			int aux = v[b];
			v[b] = v[e];
			v[e] = aux;

			do
				++b;
			while(v[b] < pivot);
			do
				--e;
			while(v[e] > pivot);
		}

		if(k <= e)
			end = e;
		else
			begin = e + 1;
	}

	return v[k - 1];
}

int main() {
	int n, k;
	fin >> n >> k;
	for(int i = 0; i < n; ++i)
		fin >> v[i];

	fout << QuickSelect(0, n - 1, k - 1) << '\n';

	fin.close();
	fout.close();
	return 0;
}