Cod sursa(job #1993425)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 22 iunie 2017 23:31:57
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <utility>
#include <vector>
#include <cstdlib>
#include <ctime>

int part(int left, int right, std::vector<int> &myV) {
    int pivot = left + rand() % (right - left);
    int ind = left;
    std::swap(myV[pivot], myV[right]);
    for (int i(left); i < right; i++) {
        if (myV[i] < myV[right]) {
            std::swap(myV[ind], myV[i]);
            ind++;
        }
    }
    std::swap(myV[right], myV[ind]);
    return ind;
}

int select(int left, int right, int k, std::vector<int> &myV) {
    if (left >= right) {
        return myV[left];
    }
    int ind = part(left, right, myV);
    if (k == ind) {
        return myV[k];
    } else if (k < ind) {
        return select(left, ind - 1, k, myV);
    }
    return select(ind + 1, right, k, myV);
}

int main() {
    std::srand(std::time(nullptr));
    std::ifstream fileIn("sdo.in");
    std::ofstream fileOut("sdo.out");

    int nV, k;
    fileIn >> nV >> k;

    std::vector<int> myV(nV);

    for (int i(0); i < nV; i++) {
        fileIn >> myV[i];
    }

    fileOut << select(0, nV - 1, k, myV);

    fileIn.close();
    fileOut.close();
    return 0;
}