Pagini recente » Cod sursa (job #3276070) | Cod sursa (job #432526) | Cod sursa (job #1479430) | Cod sursa (job #1377450) | Cod sursa (job #2279312)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int arr[3000003];
int partitie(int arr[], int l, int r);
int statistica(int arr[], int l, int r, int k)
{
//daca variabila k este mai mare decat 0 si nu depaseste nr de elemente dintre cele doua capete
if (k > 0 && k <= r - l + 1)
{
//functia partitie imi returneaza pozitia pe care ar trebui sa se afle pivotul ales
int poz = partitie(arr, l, r);
// daca poz este egal cu k
if (poz-l == k-1)
return arr[poz];
//daca poz este mai mare decat k, apelez recursiv pentru partea din stanga a vectorului
if (poz-l > k-1)
return statistica(arr, l, poz-1, k);
//altfel apelez recursiv pentru partea din dreapta a vectorului
return statistica(arr, poz+1, r, k-poz+l-1);
}
//daca pozitia k este mai mare decat nr de elemente dintr-un vector returnam 0
return 0;
}
/*void interschimbare( int &a, int &b)
{
int aux;
aux=a;
a=b;
b=aux;
}
*/
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int partitie(int arr[], int l, int r)
{
int x = arr[r], i = l;
for (int j = l; j <= r - 1; j++)
{
if (arr[j] <= x)
{
//interschimbare(arr[i], arr[j]);
swap(&arr[i], &arr[j]);
i++;
}
}
//interschimbare(arr[i], arr[r]);
swap(&arr[i], &arr[r]);
return i;
}
int main()
{
int n, i, k;
f >> n >> k;
for(i = 0; i <= n-1; i++)
f >> arr[i];
g <<statistica(arr, 0, n-1, k)<<'\n';
return 0;
}