Cod sursa(job #2482015)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 27 octombrie 2019 18:16:25
Problema Statistici de ordine Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#define DIM 3000002
#define INF 0xFFFFFFFF

using namespace std;

int N, K;
int array[DIM];

int partition(int left, int right) {

    int element = array[right];
    int i = left;

    for (int j = left; j < right; ++ j) {
        if (array[j] <= element) {
            swap(array[i], array[j]);
            ++i;
        }
    }

    swap(array[i], array[right]);
    return i;

}

int kthSmallest(int left, int right, int k) {

    while (k > 0 && k <= right - left + 1) {

        int pos = partition(left, right);

        if (pos - left + 1 == k) {
            return array[pos];
        } else if (pos - left + 1 > k) {
            right = pos - 1;
        } else {
            // pos - left < k
            k -= (pos - left + 1);
            left = pos + 1;
        }

    }

    return -5;

}

int main() {

    ifstream fin("sdo.in");
    ofstream fout("sdo.out");

    fin >> N >> K;

    for (int i = 1; i <= N; i ++) {
        fin >> array[i];
    }

    int result = kthSmallest(1, N, K);

    fout << result << '\n';

    fin.close();
    fout.close();

}