Cod sursa(job #1875546)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 11 februarie 2017 11:44:33
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<fstream>
#include<algorithm>
#define MAX 3000001

using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");

int a[MAX], i, n, k;

int selectie_aleatoare(int *a, int l, int r)
{
    int q, p, u;
    q = a[l + rand() % (r - l + 1)];
    p = l - 1;
    u = r + 1;

    while (0 < 1)
    {
        do
        {
            p++;
        }while( a[p] <= q);

        do
        {
            u--;
        }while( a[u] >= q);

        if (p < u) swap(a[p], a[u]);
        else return u;
    }

}

int partitie_aleatoare(int *a, int l, int r, int pos)
{
    int q, res;
    if (l == r) return a[l];
    q = selectie_aleatoare(a, l, r);
    res = q - l + 1;
    if (pos <= res) return partitie_aleatoare(a, l, q, pos);
    return partitie_aleatoare(a, q + 1, r, pos - res);
}

int main()
{
    fin>>n>>k;
    for (i = 0; i < n; i++)
        fin>>a[i];
    fin.close();
    fout<<partitie_aleatoare(a, 0, n - 1, k);
    fout.close();
    return 0;
}