Cod sursa(job #1521326)

Utilizator diana97Diana Ghinea diana97 Data 10 noiembrie 2015 10:23:46
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

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

const int NMAX = 3000000 + 1;

int n, k;
int v[NMAX];

void citeste() {
    f >> n >> k;
    for (int i = 1; i <= n; i++)
        f >> v[i];
}

int kth_element(int st, int dr, int k) {
    if (st == dr) return v[st];


    int p = rand() % (dr - st) + st + 1;
    int x = v[p];

    int i = st, j = dr;
    int mai_mici;


    while (i <= j) {
        while (v[i] < x) i++;
        while (v[j] > x) j--;
        if (i <= j) {
            swap(v[i], v[j]);
            i++;
            j--;
        }
    }

    mai_mici = j - st + 1;

    if (mai_mici >= k) return kth_element(st, j, k);
    return kth_element(j + 1, dr, k - mai_mici);
}

int main() {
    citeste();
    g << kth_element(1, n, k) << '\n';
    return 0;
}