Cod sursa(job #2921636)

Utilizator CiobaCatalinCioba Catalin CiobaCatalin Data 1 septembrie 2022 09:14:31
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.69 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

// void print(vector<int> &v)
// {
//     for (auto el : v)
//     {
//         cout << el << " ";
//     }
//     cout << endl;
// }
// void print(vector<int> &v, int l, int r)
// {
//     for (auto el : v)
//     {
//         cout << el << " ";
//     }
//     cout << "left: " << l << " right: " << r << endl;
// }
// void print_v(vector<int> &v, int start, int end, int k)
// {
//     for (int i = 0; i < start; i++)
//     {
//         cout << v[i] << " ";
//     }
//     cout << "[ ";
//     for (int i = start; i <= end; i++)
//     {
//         cout << v[i] << " ";
//     }
//     cout << "] ";
//     for (int i = end + 1; i < v.size(); i++)
//     {
//         cout << v[i] << " ";
//     }
//     cout << " | k=" << k << endl;
// }

int partition(vector<int> &v, int start, int end, int pivot)
{
    // cout << "partition start => ";
    // print_v(v, start, end, pivot);

    int p = v[pivot];
    swap(v[end], v[pivot]);
    // print(v);

    int left = start;
    int right = end - 1;

    while (left < right)
    {
        if (v[left] > p)
        {
            swap(v[left], v[right]);
            right--;
        }
        else
        {
            left++;
        }
        // print(v, left, right);
    }
    swap(v[left + 1], v[end]);
    // print(v, left, right);

    // vector<int> larger;
    // int equalCount = 0;

    // cout << "partition end" << endl;
    return left;
}

int cnt = 0;

int quickselect(vector<int> &v, int start, int end, int k)
{
    // if (n == 1)
    // {
    //     return v[0];
    // }
    // auto pivot = 4;
    // print(v);
    // cout << "pivot: " << v[pivot] << endl;
    // auto p = partition(v, pivot);
    // print(v);
    // cout << "pivot " << v[p] << endl;
    // return 0;
    if (start == end)
    {
        return v[start];
    }

    // print_v(v, start, end, k);

    int pivot = start;
    // cout << "pivot=" << pivot << endl;
    int new_pivot = partition(v, start, end, pivot);
    // cout << "new_pivot=" << new_pivot << endl;

    // print_v(v, start, end, k);
    // cout << endl;

    if (new_pivot == k)
    {
        return new_pivot;
    }
    else if (new_pivot > k)
    {
        return quickselect(v, start, new_pivot - 1, k);
    }
    else
    {
        return quickselect(v, new_pivot + 1, end, k);
    }
}

int main()
{
    ifstream in("sdo.in");
    ofstream out("sdo.out");

    int n, k;
    in >> n >> k;

    vector<int> v;
    v.resize(n);
    for (int i = 0; i < n; i++)
    {
        in >> v[i];
    }

    out << v[quickselect(v, 0, n - 1, k - 1)];

    // vector<int> v = {2, 1, 3, 4, 5, 6};
    // auto p = partition(v, 0, v.size() - 1, 0);
    // cout << v[p];

    return 0;
}