Cod sursa(job #2279312)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 9 noiembrie 2018 13:02:58
Problema Statistici de ordine Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb

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