Cod sursa(job #2482031)

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

using namespace std;

int N, K;
int array[DIM];

int partition(int left, int right) {

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

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

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

}

int partition_random(int left, int right) {

    srand(time(NULL));

    int random = left + rand() % (right - left + 1);
    swap(array[random], array[right]);

    return partition(left, right);
}

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

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

        int pos = partition_random(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;
        }

    }

}

int main() {

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

    fscanf(fin, "%d %d", &N, &K);

    for (int i = 1; i <= N; i ++) {
        fscanf(fin, "%d", &array[i]);
    }

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

    fprintf(fout, "%d\n", result);

    fclose(fin);
    fclose(fout);

    return 0;

}