Cod sursa(job #1948310)

Utilizator tudoras8tudoras8 tudoras8 Data 31 martie 2017 23:02:41
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
#define MAX_N 3000005
 
ifstream fin ("sdo.in");
ofstream fout ("sdo.out");
 
int A[MAX_N], N, K;
 
void citire()
{
        fin >> N >> K;
     
        for(int i = 1; i <= N; ++i)
                fin >> A[i];
}
 
int part(int A[MAX_N], int li, int lf)
{
        int i = li-1, j = lf+1, p = A[li + (rand()%(lf-li+1))];
     
        while(1)
            {
                    do
                        {
                                ++i;
                            } while(A[i] < p);
             
                    do
                        {
                                --j;
                            } while(p < A[j]);
                    if(i < j)
                            swap(A[i], A[j]);
                    else
                            return j;
                }
     
        return 0;
}
 
void sel(int A[MAX_N], int li, int lf, int k)
{
        if(li == lf)
                return;
     
        int q = part(A, li, lf);
        int t = q-li+1;
     
        if(t >= k)
                sel(A, li, q, k);
        else
                sel(A, q+1, lf, k-t);
}
 
int main()
{
        srand(time(NULL));
        citire();
        sel(A, 1, N, K);
     
        fout << A[K] << "\n";
}