Cod sursa(job #2276646)

Utilizator richard26Francu Richard richard26 Data 5 noiembrie 2018 01:15:55
Problema Statistici de ordine Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

int arr[3000001];
int mid(int left, int right)
{
	int r1 = rand() % (right - left + 1) + left;
	int r2 = rand() % (right - left + 1) + left;
	int r3 = rand() % (right - left + 1) + left;

	if(arr[r1] <= arr[r2] && arr[r1] <= arr[r3])
		return ( (arr[r2] < arr[r3]) ? arr[r2]:arr[r3]);

	if(arr[r2] <= arr[1] && arr[r2] <= arr[r3])
		return ( (arr[r3] < arr[r1]) ? arr[r3]:arr[r1]);

	if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
		return ( (arr[2] < arr[1]) ? arr[2]:arr[1]);

}

int swp(int &a, int &b)
{
	int aux = a;
	a = b;
	b = aux;
}
int partition(int left, int right)
{
	//int s = mid(left, right, arr);
	int pivot = arr[right];
    //g<<pivot<<endl;
	int i = left;
	for(int j = left; j < right; j++)
	{
		if(arr[j] <= pivot)
		{
			if(i != j) {
				swp(arr[j], arr[i]);
			}
			i++;
		}

	}
	swp(arr[right], arr[i]);
	return i  ;
}
int kel(int left, int right, int k)
{   
	//g<<left<<" "<<right<<" ";
	//g<<endl;
	//for(int i = left; i <= right; i++) g<<arr[i]<<" ";
	//g<<endl;
	int p = partition(left, right) ;
	if(p == k) return arr[k];
	   else if(k < p)	kel(left, p - 1, k);
	  	else kel(p + 1, right, k);
	  

}
int main()
{   
	
	int i, n, k;
	f>>n>>k;
	for(i = 1; i <= n; i++) f>>arr[i];
	g<<kel(1, n, k);
    return 0;

}