Cod sursa(job #2921669)

Utilizator CiobaCatalinCioba Catalin CiobaCatalin Data 1 septembrie 2022 12:45:01
Problema Statistici de ordine Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.02 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_p(vector<int> &v, int start, int end, int p)
// {
//     for (int i = 0; i < start; i++)
//     {
//         cout << v[i] << " ";
//     }
//     cout << "[ ";
//     for (int i = start; i <= end; i++)
//     {
//         if (i == p)
//         {
//             cout << "{" << v[i] << "} ";
//         }
//         else
//         {
//             cout << v[i] << " ";
//         }
//     }
//     cout << " ] ";
//     for (int i = end + 1; i < v.size(); i++)
//     {
//         cout << v[i] << " ";
//     }
//     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 partition2(vector<int> &v, int start, int end, int pivot)
{
    int p = v[pivot];
    int l = start;
    int r = end;
    // cout << "pivot " << v[pivot] << endl;

    while (true)
    {
        while (l < v.size() && v[l] <= p)
        {
            l++;
        }
        while (r >= 0 && v[r] > p)
        {
            r--;
        }
        // cout << "left: " << l << " right: " << r << endl;
        if (l >= r)
        {
            swap(v[pivot], v[r]);
            return r;
        }
        // cout << "Swapping " << v[l] << " with " << v[r] << endl;
        swap(v[l], v[r]);
    }
}

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

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

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

    // print_p(v, start, end, new_pivot);

    // 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];
    }

    int p = quickselect(v, 0, n - 1, k - 1);
    out << v[p];
    // print(v);
    // cout << v[p];

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

    return 0;
}