Cod sursa(job #2295264)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 3 decembrie 2018 14:25:40
Problema Statistici de ordine Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb

#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;
}