Cod sursa(job #883679)

Utilizator mihai0110Bivol Mihai mihai0110 Data 20 februarie 2013 11:38:56
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

//SOLUTION
int partition(std::vector<int>& v, int lower, int upper, int pivot)
{
    int i = lower;
    int j = upper;
    while (true) {
        for (; v[i] < pivot; i++);
        for (; v[j] > pivot; j--);

        if (i < j) {
            std::swap(v[i], v[j]);
        } else {
            break;
        }
    }
    return j;
}
//ENDSOLUTION

int find_kth_min(std::vector<int> &v, int lower, int upper, int k)
{
    // TODO Completati codul pentru a afla al k-lea minim din vectorul v
    if (lower >= upper) {
        return v[upper];
    }

    int p = partition(v, lower, upper, v[lower]);
    if (p == k) {
        return v[p];
    } else if (p < k) {
        return find_kth_min(v, p + 1, upper, k);
    } else {
        return find_kth_min(v, lower, p - 1, 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 << find_kth_min(v, 0, v.size() - 1, k) << '\n';
	g.close();

	return 0;
}