Cod sursa(job #804177)

Utilizator igsifvevc avb igsi Data 28 octombrie 2012 23:27:13
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
/*
 * Using randomized 3-way quicksort partition algorithm
 */
#include <fstream>
#include <cstdlib>

using namespace std;

int n, k, v[3000005];

int select (int l, int r)
{
	int i, j, q, t, pivot;

    pivot = l + rand() % (r - l + 1);
	t = v[r]; v[r] = v[pivot]; v[pivot] = t;

	for (i = l-1, j = l-1, q = l; q < r; ++q)
		if (v[r] >= v[q])
		{
			++j;
			t = v[j];
			v[j] = v[q];
			v[q] = t;
			if (v[j] != v[r])
			{
				++i;
				if (i != j)
				{
					t = v[j];
					v[j] = v[i];
					v[i] = t;
				}
			}
		}
  	t = v[++j];
	v[j] = v[r];
	v[r] = t;

	if (i < k && k <= j) return v[j];
	else if (j < k) return select (j+1, r);
	else return select (l, i);
}

int main()
{
	int i;
	ifstream fin ("sdo.in");
	ofstream fout ("sdo.out");

	srand(16);

	fin >> n >> k;
	for (i = 1; i <= n; ++i)
		fin >> v[i];

	fout << select (1, n) << endl;

	fin.close();
	fout.close();
	return 0;
}