Cod sursa(job #3233223)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 20:08:48
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

int partition(vector<int>& arr, int left, int right, int pivotIndex) {
    int pivotValue = arr[pivotIndex];
    swap(arr[pivotIndex], arr[right]);
    int storeIndex = left;

    for (int i = left; i < right; ++i) {
        if (arr[i] < pivotValue) {
            swap(arr[i], arr[storeIndex]);
            storeIndex++;
        }
    }
    swap(arr[storeIndex], arr[right]);
    return storeIndex;
}

int quickselect(vector<int>& arr, int left, int right, int k) {
    if (left == right) {
        return arr[left];
    }

    srand(time(0));
    int pivotIndex = left + rand() % (right - left + 1);

    pivotIndex = partition(arr, left, right, pivotIndex);

    if (k == pivotIndex) {
        return arr[k];
    } else if (k < pivotIndex) {
        return quickselect(arr, left, pivotIndex - 1, k);
    } else {
        return quickselect(arr, pivotIndex + 1, right, k);
    }
}

int main() {
    ifstream infile("sdo.in");
    ofstream outfile("sdo.out");

    if (!infile || !outfile) {
        cerr << "Error opening file" << endl;
        return 1;
    }

    int n, k;
    infile >> n >> k;

    vector<int> arr(n);
    for (int i = 0; i < n; ++i) {
        infile >> arr[i];
    }

    int result = quickselect(arr, 0, n - 1, k - 1);
    outfile << result << endl;

    infile.close();
    outfile.close();

    return 0;
}