Cod sursa(job #1615826)

Utilizator preda.andreiPreda Andrei preda.andrei Data 26 februarie 2016 21:34:14
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

int v[3000001];

void interschimbare(int &a, int &b);
int elementK(int k, int n);

int main()
{
    FILE *fin = fopen("sdo.in", "r");
    FILE *fout = fopen("sdo.out", "w");

    int n, k, rez;

    srand(time(NULL));

    fscanf(fin, "%d%d", &n, &k);
    for(int i = 1; i <= n; ++i)
        fscanf(fin, "%d", &v[i]);

    rez = elementK(k, n);

    fprintf(fout, "%d", rez);
    return 0;
}

int elementK(int k, int n){
    int st, dr, pivot, poz, i, j;

    st = 1;
    dr = n;
    do{
        poz = st + (rand() % (dr - st + 1));
        pivot = v[poz];
        interschimbare(v[st], v[poz]);
        i = st + 1;
        j = dr;
        while(i <= j){
            while(i <= j && pivot >= v[i])
                ++i;
            while(i <= j && pivot < v[j])
                --j;
            if(i <= j){
                interschimbare(v[i], v[j]);
                ++i;
                --j;
            }
        }
        --i;
        interschimbare(v[st], v[i]);

        if(i == k)
            return v[i];
        if(i > k)
            dr = i - 1;
        else st = i + 1;
    }while( st <= dr);
}

void interschimbare(int &a, int &b){
    int aux = a;
    a = b;
    b = aux;
}