Cod sursa(job #3252909)

Utilizator tmxmatTudor Matasaru Mihai tmxmat Data 31 octombrie 2024 14:37:10
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;

ifstream cin("sdo.in");
ofstream cout("sdo.out");

int v[3000001];

void schimba(int &a, int &b)
{
    a ^= b;
    b ^= a;
    a ^= b;
}

void interclaseaza(int* a1, int* b1, int* a2, int* b2)
{
    int* cnt1 = a1;
    int* cnt2 = a2;
    int* vec = new int[b2 - a1];
    bool bool1 = true;
    bool bool2 = true;
    while (cnt1 < b1 || cnt2 < b2)
    {
        if (cnt1 == b1)
        {
            bool1 = false;
        }
        if (cnt2 == b2)
        {
            bool2 = false;
        }
        while (cnt1 < b1 && (!bool2 || (*cnt1 <= *cnt2)))
        {
            vec[cnt1 - a1 + (cnt2 - a2)] = *cnt1;
            cnt1 ++;
        }
        while (cnt2 < b2 && (!bool1 || (*cnt1 > *cnt2)))
        {
            vec[(cnt1 - a1) + (cnt2 - a2)] = *cnt2;
            cnt2 ++;
        }
    }
    memcpy(a1, vec, (b2 - a1) * sizeof(int));
    delete[] vec;
}

void mergeSort(int* a, int* b)
{
    if (b - a == 1)
    {
        return;
    }
    else if (b - a == 2)
    {
        if (*a > *(b - 1))
        {
            schimba(*a, *(b - 1));
        }
    }
    else
    {
        int* mij = a + (b - a) / 2;
        mergeSort(a, mij);
        mergeSort(mij, b);
        interclaseaza(a, mij, mij, b);
    }
}

int main()
{
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i ++)
    {
        cin >> v[i];
    }
    mergeSort(v + 1, v + n + 1);
    cout << v[k];
    return 0;
}