Cod sursa(job #2123894)

Utilizator Y0da1NUME JMECHER Y0da1 Data 6 februarie 2018 18:28:26
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <time.h>
#include <algorithm>

using namespace std;

int v[3000005];
int N, K;
void afisare()
{
    for (int i = 0; i < N; ++i)
        cout<<v[i]<<" ";
    cout<<"\n";
}
int partitie(int st, int dr, int pivot)
{
    int val = v[pivot];
    int index = st;
    swap(v[pivot], v[dr]);
    for(int i = st; i < dr; ++i)
    {
        if(v[i] < val)
        {
            swap(v[index], v[i]);
            ++index;
        }
    }
    swap(v[index], v[dr]);
    return index;
}

int select(int st, int dr, int k)
{
    int pivot;
    if(st==dr)
        return v[st];
    srand(time(0));
    pivot = st + rand() % (dr - st);
    //cout<<pivot<<" "<<st<<" "<<dr<<endl;
    pivot = partitie(st, dr, pivot);
    //afisare();
    //cout<<pivot<<endl;

    if(k == pivot)
        return v[k];
    else if (k < pivot)
        return select(st, pivot - 1, k);
    else
        return select(pivot + 1, dr, k);
}

int main()
{

    ifstream in ("sdo.in");
    ofstream out ("sdo.out");
    in>>N>>K;
    for(int i = 0; i < N; ++i)
        in>>v[i];
    //afisare();
    //nth_element(v, v + K, v + N);
    //afisare();
    //cout<<v[K - 1];
    out<<select(0, N - 1, K - 1);
}