Cod sursa(job #880533)

Utilizator vlad.maneaVlad Manea vlad.manea Data 16 februarie 2013 21:22:19
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <string>
#include <limits>
#include <algorithm>
using namespace std;

class OrderStatistics
{
	int N, K;
	int set[3000000];

public:

	OrderStatistics(string inFile, string outFile)
	{
		read(inFile);
		solve(0, N - 1, K);
		write(outFile);
	}

private:

	void read(string inFile)
	{
		ifstream fin(inFile.c_str());
		fin >> N >> K;

		for (int i = 0; i < N; ++i)
		{
			fin >> set[i];
		}

		fin.close();
	}

	void solve(int i, int j, int p)
	{
		int l, m, f = i + p - 1;
		int v = set[i + rand() % (j - i + 1)];

		// Do the swappings
		for (l = i, m = j; l < m;)
		{
			for (; l < m && set[l] <= v; ++l);
			for (; l < m && set[m] > v; --m);
			swap(set[l], set[m]);
		}

		if (j - i <= 1)
		{
			return;
		}

		// Go to the last element
		for (l = i; set[l] <= v; ++l);

		if (f < l)
		{
			return solve(i, l - 1, p);
		}
		else
		{
			return solve(l, j, p - l + i);
		}
	}

	void write(string outFile)
	{
		ofstream fout(outFile.c_str());
		fout << set[K - 1];
		fout.close();
	}
};

int main()
{
	OrderStatistics orderStatistics("sdo.in", "sdo.out");
}