Cod sursa(job #936668)

Utilizator howsiweiHow Si Wei howsiwei Data 8 aprilie 2013 10:51:46
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef vector<int>::iterator viit;

template <typename T>
bool cmp( T a, T b ) {
	return a < b;
}

void Nth_element( viit begin, viit pos, viit end ) {
	if (*begin == *(end-1)) return;
	viit rpivot_pos = begin + rand() % ( end-begin );
	int rpivot = *rpivot_pos;
	iter_swap( rpivot_pos, end-1 );
	viit s = begin, g = end-1;
	while (s != g) {
		if (cmp( *s, rpivot )) ++s;
		else iter_swap( s, --g );
	}
	//cout << rpivot << '\n';
	//for (viit it = begin; it != end; ++it) {
		//cout << *it << ' ';
	//}
	//cout << '\n';
	if (pos < s) Nth_element( begin, pos, s );
	else Nth_element( g, pos, end );
}

int main() {
	ifstream fin("sdo.in");
	ofstream fout("sdo.out");
	int n, k;
	fin >> n >> k;
	--k;
	vector<int> a(n);
	for (int i=0; i<n; ++i)
		fin >> a[i];
	Nth_element( a.begin(), a.begin()+k, a.end() );
	fout << a[k];
	return 0;
}