Cod sursa(job #2277522)

Utilizator richard26Francu Richard richard26 Data 6 noiembrie 2018 14:34:16
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 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]) ? r2:r3);
	
 
	
	if(arr[r2] <= arr[1] && arr[r2] <= arr[r3])
	
		return ( (arr[r3] < arr[r1]) ? r3:r1);
	
 
	
	if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
	
		return ( (arr[2] < arr[1]) ? r2:r1);
	
 
	
}
	
 
	
int swp(int &a, int &b)
	
{
	
	int aux = a;
	
	a = b;
	
	b = aux;
	
}
	
int partition(int left, int right)
	
{
	
	int s = mid(left, right);
	
	swp(arr[right],arr[s]);
	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;
	
 
	
}