Cod sursa(job #2637374)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 22 iulie 2020 17:36:57
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <stdlib.h>
#include <time.h>

using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

int n, k;
int v[3000001];

int Partition(int arr[], int left, int right)
{
    srand(time(NULL));
    int index = left + (rand() % (right - left + 1));
    int pivot = arr[index];
    swap(arr[(left + right) / 2], arr[index]);

    int i = left - 1;
    int j = right + 1;

    while (true)
    {
        do
        {
            i++;
        }while (arr[i] < pivot);

        do
        {
            j--;
        }while (arr[j] > pivot);

        if (i >= j)
            return j;

        swap(arr[i], arr[j]);
    }
}

void SDO(int arr[], int left, int right, int k)
{
    if (left < right)
    {
        int pi = Partition(arr, left, right);

        if (k <= pi)
            SDO(arr, left, pi, k);
        else
            SDO(arr, pi + 1, right, k);
    }
}

int main()
{
    f >> n >> k;
    for (int i=1; i<=n; i++)
        f >> v[i];

    SDO(v, 1, n, k);

    g << v[k];

    return 0;
}