Cod sursa(job #1625688)

Utilizator Tzappy90Mihalache Constantin Tzappy90 Data 2 martie 2016 20:11:35
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <vector>

typedef unsigned int uint;

void swap(uint *a, uint *b)
{
    if (*a == *b) {
        return;
    }
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

int partition(std::vector<uint> &v, uint li, uint lf)
{
    int i = li - 1, j = lf + 1, p = v[li + (rand() % (lf - li + 1))];
    while (1) {
        do {
            ++i;
        } while (v[i] < p);

        do {
            --j;
        } while (p < v[j]);
        if (i < j)
            swap(&v[i], &v[j]);
        else
            return j;
    }

    return 0;
}

uint find_kth_min(std::vector<uint> &v, uint lower, uint upper, uint k)
{
    uint p;
    do {
        p = partition(v, lower, upper);
        if (p == k)
            break;
        if (p < k) {
            lower = p + 1;
        } else {
            upper = p - 1;
        }
    } while (lower < upper);

    return v[k];
}

int main(void)
{
    std::ifstream f("sdo.in");
    std::ofstream g("sdo.out");
    uint n, k;
    f >> n >> k;
    std::vector<uint> v(n);
    for (uint i = 0; i<n; f>> v[i++]) {
    }
    g << find_kth_min(v, 0, v.size() - 1, k - 1) << '\n';
    f.close();
    g.close();
}