Cod sursa(job #1669978)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 31 martie 2016 12:28:18
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 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)//plasez elementul p unde trebuie
    {
        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)//cand trebuie sa sortez intre k si k, am terminat
        return;

    int q = part(A, li, lf);// in stanga lui Q, mai mici decat a[Q]; in dreapta mai mari
    int t = q-li+1;

    if(t >= k)//tind binar spre k;
        sel(A, li, q, k);
    else
        sel(A, q+1, lf, k-t);
}

int main()
{
    srand(time(NULL));
    fin >> N >> K;
    for(int i = 1; i <= N; ++i)
        fin >> A[i];
    sel(A, 1, N, K);
    fout << A[K] << "\n";//atentie, vectorul NU este complet ordonat
}