Cod sursa(job #1329932)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 30 ianuarie 2015 00:40:31
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
/*
 * =====================================================================================
 *
 *       Filename:  order_statistics.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  01/30/2015 00:11:53
 *       Revision:  none
 *       Compiler:  gcc/g++
 *
 *         Author:  Marius-Constantin Melemciuc  
 *          email:  
 *   Organization:  
 *
 * =====================================================================================
 */

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <fstream>

using namespace std;

void swap(int& a, int& b)
{
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
}

int partition(vector<int>& array, int left, int right)
{
	int x = array[right];
	int i = left - 1;

	for (int j = left; j < right; j++)
		if (array[j] <= x)
		{
			i++;
			swap(array[i], array[j]);
		}

	swap(array[i + 1], array[right]);
	return i + 1;
}

int randomizedPartition(vector<int>& array, int left, int right)
{
	int random = left + (rand() % (right - left));
	
	swap(array[right], array[random]);
	return partition(array, left, right);
}

int orderStatistics(vector<int>& array, int left, int right, int i)
{
	if (left == right)
		return array[left];

	int pivot = randomizedPartition(array, left, right);
	int k = pivot - left + 1;

	if (k == i)
		return array[pivot];

	if (i < k)
		return orderStatistics(array, left, pivot - 1, i);
	else 
		return orderStatistics(array, pivot + 1, right, i - k);	
}

int main(int argc, char** argv)
{

	ifstream input("sdo.in");
	ofstream output("sdo.out");

	int n, x;
	vector<int> array;

	input >> n >> x;

	for (int i = 0; i < n; i++)
	{
		int z;

		input >> z;
		array.push_back(z);
	}

	output << orderStatistics(array, 0, array.size() - 1, x);
	output << '\n';

	return 0;	
}