Cod sursa(job #941186)

Utilizator forgetHow Si Yu forget Data 18 aprilie 2013 08:09:18
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <fstream>
using namespace std;

int main()
{
	ifstream fin("sdo.in");
	ofstream fout("sdo.out");
	int n, k;
	fin >> n >> k;
	int a[n];
	for (int i = 0; i < n; ++i)
		fin >> a[i];
	int l = 0, r = n-1;
	while (true) {
		swap(a[(l+r)/2],a[r]);
		int pivot = a[r];
		int i(l-1), j(r), p(l), q(r-1);
		while (true) {
			while (a[++i] < pivot);
			while (a[--j] > pivot && j >= i);
			if (i >= j) break;
			swap(a[i],a[j]);
			if (a[i] == pivot) swap(a[p++],a[i]);
			if (a[j] == pivot) swap(a[q--],a[j]);
		}
		if (k <= i-p) {
			l = p;
			r = i-1;
		}
		else if (k > i+r-q-l) {
			k -= i+r-q-l;
			l = i;
			r = q;
		}
		else {
			fout << pivot;
			break;
		}
	}
	return 0;
}