Cod sursa(job #1868700)

Utilizator M.AnaAna Marginean M.Ana Data 5 februarie 2017 11:09:06
Problema Statistici de ordine Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>

using namespace std;

ifstream in ("sdo.in");
ofstream out("sdo.out");
int n, k;
int v[3000001];

int partition(int v[], int left, int right) {
	int i = left - 1, j = right + 1;
	int pivot = v[left + rand() % (right - left + 1)];

	while (true) {
		do { ++i; } while (v[i] < pivot);

		do { --j; } while (v[j] > pivot);

		if (i < j) {
			int aux = v[i];
			v[i] = v[j];
			v[j] = aux;
		}
		else return j;
	}
	
	return 0;
}

void quicksort(int v[], int left, int right, int k) {
	if (left == right) return;

	int index = partition(v, left, right);
	int t = index - left + 1;

	if (t >= k)
		quicksort(v, left, index, k);
	else
		quicksort(v, index + 1, right, t - k);
}

int main()
{
	srand(time(NULL));

	in >> n >> k;

	for (int i = 1; i <= n; i++) {
		in >> v[i];
	}

	quicksort(v, 1, n, k);

	out << v[k];
}