Cod sursa(job #2975687)

Utilizator vladm98Munteanu Vlad vladm98 Data 7 februarie 2023 01:34:52
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

int v[3000005];
int aux[3000005];

int randomValue(int a, int b) {
    return rand() % (b - a + 1) + a;
}

int findValue(int left, int right, int k) {
    int pivot = randomValue(left, right);
    int currentPosition = left;
    for (int i = left; i <= right; ++i) {
        if (i == pivot) continue;
        if (v[i] > v[pivot]) continue;
        aux[currentPosition] = v[i];
        currentPosition += 1;
    }
    aux[currentPosition] = v[pivot];
    int pivotPosition = currentPosition;
    currentPosition += 1;
    for (int i = left; i <= right; ++i) {
        if (v[i] <= v[pivot]) continue;
        aux[currentPosition] = v[i];
        currentPosition += 1;
    }
    for (int i = left; i <= right; ++i) {
        v[i] = aux[i];
    }
    if (pivotPosition == k) {
        return v[pivotPosition];
    }
    if (k < pivotPosition) {
        return findValue(left, pivotPosition - 1, k);
    }
    return findValue(pivotPosition + 1, right, k);
}


int main() {
    ifstream fin ("sdo.in");
    ofstream fout ("sdo.out");
    int n, k;
    fin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
    }
    fout << findValue(1, n, k);
    return 0;
}