Cod sursa(job #3346577)

Utilizator _razban96Chiurtu Razvan _razban96 Data 14 martie 2026 12:52:33
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;

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

/*void printv(long long v[], int n) {
    for (int i = 0; i < n; i++) cout << v[i] << ' ';
    cout << '\n';
} */
/*void insertionSort(long long v[], int n) {
    for (int i = 1; i < n; i++) {
        long long key = v[i];
        int j = i - 1;
        while (j >= 0 && key < v[j]) {
            v[j + 1] = v[j];
            j--;
        }
        v[j + 1] = key;
    }
} */
int partition(long long v[], int left, int right) {
    int i = left + 1;
    int j = right;
    int random_index = left + rand() % (right - left + 1);
    swap(v[random_index], v[left]);

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

/*void quick_sort(long long *v, int left, int right) {
    if (left < right) {
        int pivot_position = partition(v, left, right);
        quick_sort(v, left, pivot_position - 1);
        quick_sort(v, pivot_position + 1, right);
    }
} */
long long quick_select(long long v[], int left, int right, int k) {
    if (left == right) return v[left];

    int pivot_position = partition(v, left, right);

    if (pivot_position == k)
        return v[pivot_position];
    if (k < pivot_position)
        return quick_select(v, left, pivot_position - 1, k);
    return quick_select(v, pivot_position + 1, right, k);
}

int main() {
    if (!fin.is_open()) {
        fin.clear();
        fin.open("cmake-build-debug/sdo.in");
        if (!fin.is_open()) {
            cout << "Error: I cannot find sdo.in!" << '\n';
            return 1; // Stop the program early
        }
    }
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    srand(time(nullptr));

    int n = 0, k = 0;
    fin >> n >> k;
    long long *v = new long long[n + 1];
    for (int i = 1; i <= n; i++) fin >> v[i];
    if (k >= 1 && k <= n)
        fout << quick_select(v, 1, n, k);

    delete[] v;
    fin.close();
    fout.close();
    return 0;
}