Pagini recente » Cod sursa (job #2480757) | Cod sursa (job #1460120) | Cod sursa (job #3000194) | Cod sursa (job #1873437) | Cod sursa (job #2276825)
#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[r1] && arr[r2] <= arr[r3])
return ( (arr[r3] < arr[r1]) ? arr[r3]:arr[r1]);
if(arr[r3] <= arr[r2] && arr[r3] <= arr[r1])
return ( (arr[r2] < arr[r1]) ? arr[r2]:arr[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);
int pivot = arr[s];
//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[s], 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;
if(right - left <= 1) return arr[k];
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];
srand(time(NULL));
g<<kel(1, n, k);
return 0;
}