Cod sursa(job #1449074)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 8 iunie 2015 18:28:44
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdlib>
#include <ctime>
#include <fstream>

using namespace std;

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

#define N 3000005

int v[N], n, k;

inline void schimb(int &x, int &y)
{
    int aux = x;
    x = y;
    y = aux;
}

void part3(int a[N], int li, int lf, int &p1, int &p2) {
    p1 = li;
    p2 = lf - 1;
    int i = li, piv = a[lf];
    while (i <= p2) {
        if (a[i] < piv)
            schimb(a[i++], a[p1++]);
        else if (a[i] > piv)
            schimb(a[i], a[p2--]);
        else
            i++;
    }
    schimb(a[lf], a[++p2]);
}

void quicksort(int a[N], int li, int lf, int k) {
    int m1, m2;
    if(li>=lf)
        return;
    //m=pozdiv(a,li,lf);
    part3(a, li, lf, m1, m2);

    if(k < m1)
        quicksort(a, li, m1 - 1, k);
    if(k > m2)
        quicksort(a, m2 + 1, lf, k);
}

int main()
{
    srand(time(NULL));

    in >> n >> k;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    for (int i = n; i >= 1; i--)
    {
        int p = 1 + rand()%i;
        schimb(v[i], v[p]);
    }

    quicksort(v, 1, n, k);

    out << v[k] << '\n';
    return 0;
}