Cod sursa(job #2330291)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 28 ianuarie 2019 10:46:02
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <random>

const int NMAX = 3000005;

int n, k, a[NMAX];

std::ifstream in("sdo.in");
std::ofstream out("sdo.out");

std::random_device rd;

int randomInRange(int a, int b) {
  static std::mt19937 eng(rd());
  std::uniform_int_distribution<> distr(a, b);
  return distr(eng);
}

int partition(int left, int right, int pivot) {
  int pivotVal = a[pivot];
  std::swap(a[pivot], a[right]);
  int index = left;

  for (int i = left; i < right; ++i) {
    if (a[i] < pivotVal) {
      std::swap(a[index], a[i]);
      ++index;
    }
  }

  std::swap(a[right], a[index]);
  return index;
}

int select(int left, int right, int k) {
  if (left == right)
    return a[left];

  int pivot = randomInRange(left, right);
  pivot = partition(left, right, pivot);

  if (k == pivot)
    return a[k];

  if (k < pivot)
    return select(left, pivot - 1, k);
  return select(pivot + 1, right, k);
}

int main() {
  in >> n >> k;
  for (int i = 1; i <= n; ++i)
    in >> a[i];
  out << select(1, n, k);
  return 0;
}