Cod sursa(job #689542)

Utilizator mihai0110Bivol Mihai mihai0110 Data 24 februarie 2012 17:16:04
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

static int part(vector<int>& v, int infL, int supL) {	
	int i = infL, j = supL, p = v[infL];
	while (1) {
		for (; v[i] < p; i++);
		for (; p < v[j]; j--);

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

static void select(vector<int>& v, int infL, int supL, int k) {
	if (infL == supL)
		return;

	int pivot = part(v, infL, supL);

	if (pivot >= k)
		select(v, infL, pivot, k);
	else
		select(v, pivot + 1, supL, k);
}

int kth_min(vector<int>& v, int k) {
	select(v, 0, v.size() - 1, k);
	return v[k];
}

int main(void) {
	//read data
	vector <int> v;
	int n, k;

	ifstream f("sdo.in");

	f >> n >> k;
	k--;
	for (int i = 0; i < n; i++) {
		int val;
		f >> val;
		v.push_back(val);
	}

	f.close();

	//Print results
	ofstream g("sdo.out");
	g << kth_min(v, k) << '\n';
	g.close();

	return 0;
}