Cod sursa(job #1679685)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 8 aprilie 2016 10:08:42
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <ctime>

using namespace std;

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

int n, k;

int v[3000005];

int getPos(int left, int right) {

    int piv = left + rand()%(right - left + 1);

    swap(v[left], v[piv]);

    for (int di = 0, dj = -1; left < right; left += di, right += dj) {

        if (v[left] > v[right]) {

            swap(v[left], v[right]);
            swap(di, dj);
            di *= -1, dj *= -1;

        }

    }

    return left;

}

int main() {

    srand(time(NULL));

    fin >> n >> k;

    for (int i = 1; i <= n; ++i)
        fin >> v[i];

    int left = 1, right = n;
    while (left <= right) {

        int mid = getPos(left, right);

        if (mid == k) {
            fout << v[k] << '\n';
            return 0;
        }

        if (mid > k)
            right = mid - 1;
        else
            left = mid + 1;

    }

    return 0;

}

//Trust me, I'm the Doctor!