Cod sursa(job #3167215)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 10 noiembrie 2023 13:15:16
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <vector>

using namespace std;

pair<vector<int>, vector<int> > partitioning(vector<int> v, int pivot) {
    vector<int> smallerThanPivot, greaterThanPivot;
    for (int i = 0; i < (int)v.size(); i++)
        if (v[i] < v[pivot])
            smallerThanPivot.push_back(v[i]);
        else
            greaterThanPivot.push_back(v[i]);
    return make_pair(smallerThanPivot, greaterThanPivot);
}

int kth_element(vector<int> v, int k) {
    if (k == 1)
        return v[0];
    
    int pivot = (int)v.size() / 2;
    pair<vector<int>, vector<int> > partitioned = partitioning(v, pivot);
    vector<int> smallerThanPivot = partitioned.first;
    vector<int> greaterThanPivot = partitioned.second;

    if ((int)smallerThanPivot.size() < k) {
        return kth_element(greaterThanPivot, k - (int)smallerThanPivot.size());
    }
    return kth_element(smallerThanPivot, k);
}

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

    int n, k, ans, x;
    vector<int> v;

    fscanf(fin, "%d %d", &n, &k);
    for (int i = 0; i < n; i++) {
        fscanf(fin, "%d", &x);
        v.push_back(x);
    }

    ans = kth_element(v, k);
    fprintf(fout, "%d\n", ans);
    
    fclose(fin);
    fclose(fout);
    return 0;
}