Pagini recente » Cod sursa (job #2624446) | Borderou de evaluare (job #1551177) | Cod sursa (job #2210093) | Cod sursa (job #2586387) | Cod sursa (job #2295264)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int v[3000003];
int partitie(int v[], int l, int r);
int statistica(int v[], 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(v, l, r);
// daca poz este egal cu k
if (poz-l == k-1)
return v[poz];
//daca poz este mai mare decat k, apelez recursiv pentru partea din stanga a vectorului
if (poz-l > k-1)
return statistica(v, l, poz-1, k);
//altfel apelez recursiv pentru partea din dreapta a vectorului
return statistica(v, 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 v[], int l, int r)
{
int x = v[r], i = l;
for (int j = l; j <= r - 1; j++)
{
if (v[j] <= x)
{
//interschimbare(v[i], v[j]);
swap(&v[i], &v[j]);
i++;
}
}
//interschimbare(v[i], v[r]);
swap(&v[i], &v[r]);
return i;
}
int main()
{
int n, i, k;
f >> n >> k;
for(i = 0; i <= n-1; i++)
f >> v[i];
g <<statistica(v, 0, n-1, k)<<'\n';
return 0;
}